我正在使用Beautiful Soup从过去的奥运会中获得奖牌获得者。它在一些活动和运动员名字中使用口音绊倒了。我在网上看到过类似的问题,但我是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")
非常感谢你的帮助。
答案 0 :(得分: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可能会automatic unicode decoding,因此您可以在回复时跳过codecs.decode
。