无法将某些字符(商标符号等)写入文件,但能在屏幕上显示
我一直在尝试从一个网站上抓取数据,并把找到的数据写入一个文件。大部分情况下,超过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
2 个回答
0
你有没有检查一下你要写入的文件的编码方式,确保你写的字符在这种编码下是可以显示的?可以试着把字符编码设置为UTF-8或者其他明确的编码,这样字符就能正常显示了。
1
你的 f.write()
这一行让我有点困惑——因为 stream
是从 tag.text
间接生成的,所以它会是 unicode
类型。而且 BeautifulSoup 会给你 Unicode,所以你不应该对 stream
调用 decode
。通常你用 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'))