我一直在尝试从网站上抓取数据并将找到的数据写入文件。超过 90% 的时间,我不会遇到 Unicode 错误,但是当数据具有以下字符(例如“Burger King®, Hans Café”)时,它不喜欢将其写入文件,因此我的错误处理打印出来它按原样显示在屏幕上,没有任何进一步的错误。
我尝试了编码和解码函数以及各种编码,但都无济于事。
请在下面找到我编写的当前代码的摘录:
import urllib2,sys
import re
import os
import urllib
import string
import time
from BeautifulSoup import BeautifulSoup,NavigableString, SoupStrainer
from string import maketrans
import codecs
f=codecs.open('alldetails7.txt', mode='w', encoding='utf-8', errors='replace')
...
soup5 = BeautifulSoup(html5)
enc_s5 = soup5.originalEncoding
for company in iter(soup5.findAll(height="20px")):
stream = ""
count_detail = 1
for tag in iter(company.findAll('td')):
if count_detail > 1:
stream = stream + tag.text.replace(u',',u';')
if count_detail < 4 :
stream=stream+","
count_detail = count_detail + 1
stream.strip()
try:
f.write(str(stnum)+","+br_name_addr+","+stream.decode(enc_s5)+os.linesep)
except:
print "Unicode error ->"+str(storenum)+","+branch_name_address+","+stream
请您参考如下方法:
你的 f.write()行对我来说没有意义 - stream将是 unicode因为它是从 tag.text 间接制作的和 BeautifulSoup gives you Unicode , 所以你不应该调用 decode在 stream . (您使用 decode 将具有特定字符编码的 str 转换为 unicode 。)您已经使用 codecs.open() 打开文件进行写入。并告诉它使用 UTF-8,这样你就可以 write()一个unicode这应该有效。所以,我会尝试:
f.write(unicode(stnum)+br_name_addr+u","+stream+os.linesep)
... 或者,假设您刚刚用 f=open('alldetails7.txt','w') 打开文件,你会这样做:
line = unicode(stnum)+br_name_addr+u","+stream+os.linesep
f.write(line.encode('utf-8'))
