4

私は過去のオリンピックからメダルの勝者を引き出すためにBeautifulSoupを使用しています。いくつかのイベントやアスリートの名前でのアクセントの使用につまずきます。オンラインで同様の問題が投稿されているのを見てきましたが、Pythonを初めて使用し、コードに適用するのに問題があります。

スープをプリントするとアクセントが綺麗に見えます。しかし、スープの解析を開始すると(そして、CSVファイルに書き込むと)、アクセントのある文字が文字化けします。「LouisPerrée」は「LouisPerr√©e」になります

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")

助けてくれて本当にありがとうございます。

4

1 に答える 1

3

Unicode を扱っている場合は、ディスクまたはネットワークから読み取った応答を常に、文字列ではなくバイトのバッグとして扱います。

CSV ファイルのテキストはおそらく utf-8 でエンコードされているため、最初にデコードする必要があります。

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

また、出力ファイルに書き込む前に、Unicode テキストを 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))

編集: BeautifulSoup はおそらく自動 Unicode デコードcodecs.decodeを行うため、応答をスキップできます。

于 2012-04-22T04:58:47.463 に答える