Красивый суп и кодировка символов - PullRequest
4 голосов
/ 13 августа 2011

Я пытаюсь извлечь текст и HTML из веб-сайта со скандинавскими символами, используя Beautiful Soup и Python 2.6.5.

html = open('page.html', 'r').read()
soup = BeautifulSoup(html)

descriptions = soup.findAll(attrs={'class' : 'description' })

for i in descriptions:
    description_html = i.a.__str__()
    description_text = i.a.text.__str__()
    description_html = description_html.replace("/subdir/", "http://www.domain.com/subdir/")
    print description_html

Однако при выполнении программы происходит сбой со следующим сообщением об ошибке:

Traceback (most recent call last):
    File "test01.py", line 40, in <module>
        description_text = i.a.text.__str__()
UnicodeEncodeError: 'ascii' codec can't encode character u'\xe4' in position 19:         ordinal not in range(128)

Кажется, что входная страница закодирована в ISO-8859-1, если это поможет.Я попытался установить правильную исходную кодировку с помощью BeautifulSoup(html, fromEncoding="latin-1"), но это тоже не помогло.

Это 2011 год, и я борюсь с тривиальными проблемами кодировки символов, я думаю, что есть действительно простое решение всего этого.

Ответы [ 2 ]

5 голосов
/ 13 августа 2011
i.a.__str__('latin-1')

или

i.a.text.encode('latin-1')

должно работать.

Вы уверены, что это latin-1? Он должен правильно определить кодировку.

Кроме того, почему бы просто не использовать str(i.a), если это происходит, вам не нужно указывать кодировку?

Edit: похоже, вам нужно установить chardet , чтобы он автоматически обнаруживал кодировки.

0 голосов
/ 22 марта 2016

У меня была та же проблема с Beautiful Soup, который не смог вывести строку текста, содержащую немецкие символы. К сожалению, существует множество ответов даже на stackoverflow, которые не решили мою проблему:

        title = str(link.contents[0].string)  

Это дало 'UnicodeEncodeError:' ascii codec не может кодировать символ u '\ xe4' в позиции 32: порядковый номер не в диапазоне (128)

Многие ответы содержат ценные указания относительно правильного решения. Как говорит Леннарт Регебро в UnicodeEncodeError: кодек «ascii» не может кодировать символ u '\ u2013' в позиции 3 2: порядковый номер не в диапазоне (128) :

Когда вы делаете str (u '\ u2013'), вы пытаетесь конвертировать Unicode строка в 8-битную строку. Для этого вам нужно использовать кодировку, отображение между данными Unicode на 8-битные данные. Что делает str (), так это использует системную кодировку по умолчанию, которая в Python 2 является ASCII. ASCII содержит только 127 первых кодовых точек Unicode, то есть \ U007F1. В результате вы получаете вышеуказанную ошибку, кодек ASCII просто не знает, что такое \ u2013 (кстати, это длинная черта).

Для меня это был простой случай не использования str () для преобразования объекта Beautiful Soup в формат строки. Вмешательство в вывод консоли по умолчанию также не имело значения.

            ### title = str(link.contents[0].string)
            ### should be
            title = link.contents[0].encode('utf-8')
...