无法将某些字符(商标符号等)写入文件,但能在屏幕上显示

3 投票
2 回答
1451 浏览
提问于 2025-04-16 12:31

我一直在尝试从一个网站上抓取数据,并把找到的数据写入一个文件。大部分情况下,超过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'))

撰写回答