Не удается декодировать вывод из BeautifulSoup в Python - PullRequest
0 голосов
/ 03 декабря 2011

Я пытался написать небольшой скребок на Python, используя BeautifulSoup.Все идет гладко, пока я не попытаюсь напечатать (или записать в файл) строки, содержащиеся в различных элементах HTML.Сайт, который я собираю: http://www.yellowpages.ca/search/si/1/Boots/Montreal+QC, который содержит различные французские символы.По какой-то причине, когда я пытаюсь распечатать содержимое в терминале или в файл, вместо того, чтобы декодировать строку, как это должно быть, я получаю необработанный вывод Unicode.Вот сценарий:

from BeautifulSoup import BeautifulSoup as bs
import urllib as ul
##import re

base_url = 'http://www.yellowpages.ca'
data_file = open('yellow_file.txt', 'a')

data = ul.urlopen(base_url + '/locations/Quebec/Montreal/90014002.html').readlines()

bt = bs(str(data))

result = bt.findAll('div', 'ypgCategory')

bt = bs(str(result))

result = bt.findAll('a')

for tag in result:
    link = base_url + tag['href']
    ##print str(link)
    data = ul.urlopen(link).readlines()

    #data = str(data).decode('latin-1')
    bt = bs(str(data), convertEntities=bs.HTML_ENTITIES, fromEncoding='latin-1')
    titles = bt.findAll('span', 'listingTitle')
    phones = bt.findAll('a', 'phoneNumber')

    entries = zip(titles, phones)

    for title, phone in entries:
        #print title.prettify(encoding='latin-1')
        #data_file.write(title.text.decode('utf-8') + "   " + phone.text.decode('utf-8') + "\n")
        print title.text

data_file.close()

/ ************ /

И вывод этого: Projets Autochtones Du Qu \ xc3 \ xa9bec

Как вы можете видеть, e с акцентом, который должен идти в Квебеке, не 'т отображение.Я перепробовал все упомянутое на SO, вызывая unicode (), переходя от Encoding к супу, .decode ('latin-1'), но я ничего не получаю.

Есть идеи?

Ответы [ 2 ]

3 голосов
/ 03 декабря 2011

Это должно быть что-то вроде того, что вы хотите:

from BeautifulSoup import BeautifulSoup as bs
import urllib as ul

base_url = 'http://www.yellowpages.ca'
data_file = open('yellow_file.txt', 'a')

bt = bs(ul.urlopen(base_url + '/locations/Quebec/Montreal/90014002.html'))

for div in bt.findAll('div', 'ypgCategory'):
    for a in div.findAll('a'):
        link = base_url + a['href']

        bt = bs(ul.urlopen(link), convertEntities=bs.HTML_ENTITIES)

        titles = bt.findAll('span', 'listingTitle')
        phones = bt.findAll('a', 'phoneNumber')

        for title, phone in zip(titles, phones):
            line = '%s   %s\n' % (title.text, phone.text)
            data_file.write(line.encode('utf-8'))
            print line.rstrip()

data_file.close()
0 голосов
/ 03 декабря 2011

Кто сказал вам использовать latin-1 для декодирования чего-то, что UTF-8? (четко указано в метатеге)

  1. Если вы пользуетесь Windows, у вас могут возникнуть проблемы с выводом Unicode на консоль, лучше сначала проверить запись в текстовые файлы.

  2. если вы открываете файл как текст, не записывайте в него двоичный файл:

    • codecs.open(...,"w","utf-8").write(unicode_str)
    • open(...,"wb").write(unicode_str.encode("utf_8"))
...