Некоторые символы (знак торговой марки и т. Д.) Не могут записываться в файл, но их можно распечатать на экране - PullRequest
2 голосов
/ 25 февраля 2011

Я пытался собрать данные с веб-сайта и записать данные, которые я нашел, в файл.Более 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 голосов
/ 25 февраля 2011

Ваша строка f.write() не имеет смысла для меня - stream будет unicode, поскольку она сделана косвенно из tag.text и BeautifulSoup дает вам Unicode , так что вы не должны Звоните decode на stream. (Вы используете decode, чтобы превратить str с определенной кодировкой символов в unicode.) Вы открыли файл для записи с помощью codecs.open() и сказали ему использовать UTF-8, так что вы можете просто write() a 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'))
0 голосов
/ 25 февраля 2011

Вы проверили кодировку файла, в который пишете, и убедились, что символы могут отображаться в кодировке, которую вы пытаетесь записать в файл?Попробуйте установить кодировку символов в UTF-8 или что-то еще явно, чтобы символы отображались.

...