2012-04-22 6 views
3

나는 아름다운 올림픽 메달 획득자를 끌어 올리기 위해 아름다운 수프를 사용하고 있습니다. 일부 이벤트 및 운동 선수 이름에서 액센트를 사용하는 것보다 많이 걸립니다. 비슷한 문제가 온라인에 게시 된 것을 보았습니다. 그러나 Python을 처음 사용하고 코드에 적용하는 데 어려움이 있습니다.액센트와 다른 문자가있는 아름다운 스프 사용하기

수프를 인쇄하면 악센트가 잘 보입니다. 하지만 내가 수프를 파싱하기 시작하면 (그리고 CSV 파일에 쓰면) 악센트 부호가있는 문자가 왜곡됩니다. '루이 Perrée는'루이 Perr√ © 전자 '당신의 도움에 대한

from BeautifulSoup import BeautifulSoup 
import urllib2 

response = urllib2.urlopen('http://www.databaseolympics.com/sport/sportevent.htm?sp=FEN&enum=130') 
html = response.read() 
soup = BeautifulSoup(html) 

g = open('fencing_medalists.csv','w"') 
t = soup.findAll("table", {'class' : 'pt8'}) 

for table in t: 
    rows = table.findAll('tr') 
    for tr in rows: 
     cols = tr.findAll('td') 
     for td in cols: 
      theText=str(td.find(text=True)) 
      #theText=str(td.find(text=True)).encode("utf-8") 
      if theText!="None": 
       g.write(theText) 
      else: 
       g.write("") 
      g.write(",") 
     g.write("\n") 

많은 감사가됩니다.

+0

나는 당신의 코드를 시험해 보았다. 파일의 시작 부분에 "# - * - coding : utf-8 - * -"을 넣었습니까? – WooParadog

+0

@WooParadog : 그는 코딩 선언이 필요 없습니다. 그의 소스 코드에는 유니 코드 리터럴이 인코딩되어 있지 않습니다. 코딩 선언은 소스 코드를 컴파일 할 때 Python 컴파일러를 사용하기위한 것입니다. –

답변

2

유니 코드를 다루는 경우 디스크 또는 네트워크에서 읽은 응답을 항상 문자열 대신 바이트로 처리하십시오.

CSV 파일의 텍스트는 아마도 utf-8로 인코딩되어 있으므로 먼저 디코딩해야합니다.

import codecs 
# ... 
content = response.read() 
html = codecs.decode(content, 'utf-8') 

또한 유니 코드 텍스트를 출력 파일에 기록하기 전에 utf-8로 인코딩해야합니다. codecs.open을 사용하여 인코딩을 지정하여 출력 파일을 엽니 다. 그것은 당신을 위해 출력 인코딩을 투명하게 처리 할 것입니다.

g = codecs.open('fencing_medalists.csv', 'wb', encoding='utf-8') 

및 문자열 코드를 작성을 다음과 같이 변경합니다

theText = td.find(text=True) 
    if theText is not None: 
     g.write(unicode(theText)) 

편집 : 당신이 응답에 codecs.decode를 건너 뛸 수 있도록 BeautifulSoup로 아마, automatic unicode decoding 않습니다.

+0

응답 해 주셔서 감사합니다. codecs.open을 추가하고 utf-8로 인코딩하려고하면 다음 오류가 반환됩니다. 파일 "scrape_fencing_medalists.py", 줄 29, g.write (theText) 파일 "/ Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/codecs.py ", 줄 691, 쓰기 return self.writer.write (data) 파일"/ 라이브러리 /Frameworks/Python.framework/Versions/2.7/ lib/python2.7/codecs.py ", 줄 351 쓰기, 데이터, 소비 = self.encode (object, self.errors) UnicodeDecodeError : 'ascii'코덱은 0 바이트 위치 0xc3을 디코딩 할 수 없습니다. 범위 안에 (128) –

+0

당신은 쓰기 전에 추출한 텍스트를'str'에 강요했습니다. 코덱 모듈은 적절한 인코딩으로 투명하게 '유니 코드'객체를 작성합니다. 스크립트에서 변경해야하는 내용으로 답변을 업데이트했습니다. – Imran

관련 문제