Как анализировать HTML с не-ASCII символами, используя BeautifulSoup? - PullRequest
0 голосов
/ 17 июля 2011

Я продолжаю получать следующую ошибку при попытке разобрать html с помощью BeautifulSoup:

UnicodeDecodeError: 'ascii' codec can't decode byte 0xae in position 0: ordinal not in range(128)

Я пытался расшифровать html, используя решение для вопросов ниже, но продолжаю получать ту же ошибку. Я испробовал все решения для приведенных ниже вопросов, но ни один из них не сработал (публикуя сообщения, чтобы я не получал повторяющихся ответов и в случае, если они помогают кому-либо найти решение, просматривая соответствующие подходы к проблеме).

Кто-нибудь знает, где я здесь не так? Это ошибка в BeautifulSoup и стоит ли устанавливать более раннюю версию?

РЕДАКТИРОВАТЬ: код и трассировка ниже:

from BeautifulSoup import BeautifulSoup as bs
soup = bs(html)

Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File "/var/lib/python-support/python2.5/BeautifulSoup.py", line 1282, in __init__
    BeautifulStoneSoup.__init__(self, *args, **kwargs)
  File "/var/lib/python-support/python2.5/BeautifulSoup.py", line 946, in __init__
    self._feed()
  File "/var/lib/python-support/python2.5/BeautifulSoup.py", line 971, in _feed
    SGMLParser.feed(self, markup)
  File "/usr/lib/python2.5/sgmllib.py", line 99, in feed
    self.goahead(0)
  File "/usr/lib/python2.5/sgmllib.py", line 133, in goahead
    k = self.parse_starttag(i)
  File "/usr/lib/python2.5/sgmllib.py", line 285, in parse_starttag
    self._convert_ref, attrvalue)
UnicodeDecodeError: 'ascii' codec can't decode byte 0xae in position 0: ordinal not in range(128)

РЕДАКТИРОВАТЬ: сообщение об ошибке на комментарий ниже:

Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File "/var/lib/python-support/python2.5/BeautifulSoup.py", line 1282, in __init__
    BeautifulStoneSoup.__init__(self, *args, **kwargs)
  File "/var/lib/python-support/python2.5/BeautifulSoup.py", line 946, in __init__
    self._feed()
  File "/var/lib/python-support/python2.5/BeautifulSoup.py", line 971, in _feed
    SGMLParser.feed(self, markup)
  File "/usr/lib/python2.5/sgmllib.py", line 99, in feed
    self.goahead(0)
  File "/usr/lib/python2.5/sgmllib.py", line 133, in goahead
    k = self.parse_starttag(i)
  File "/usr/lib/python2.5/sgmllib.py", line 285, in parse_starttag
    self._convert_ref, attrvalue)
UnicodeDecodeError: 'ascii' codec can't decode byte 0xae in position 0: ordinal not in range(128)

Спасибо за вашу помощь!

Ошибка кодека 'ASCII' в BeautifulSoup

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

Как преобразовать формат файла из Unicode в ASCII, используя Python?

python UnicodeEncodeError> Как я могу просто удалить тревожные символы Юникода?

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

Ответы [ 2 ]

2 голосов
/ 18 июля 2011

Я пытался использовать pyquery для HTML, и результат в порядке.

import urllib
from pyquery import PyQuery

html = urllib.urlopen('http://www.6pm.com/onitsuka-tiger-by-asics-ultimate-81').read()
pq = PyQuery(html)
print pq('span#price').text() # "$39.00 40% off MSRP $65.00"

pyquery основан на lxml, поэтому он также намного быстрее, чем Beautifulsoup.

2 голосов
/ 18 июля 2011

Вы говорите в комментарии: "" "Я только что посмотрел тип содержимого html, который я пытаюсь проанализировать, чтобы увидеть, не было ли это тем, что я не пробовал (ранее я просто предполагал, что это был UTF-8) но, конечно же, это был UTF-8, поэтому еще один тупик. "" "

Вздох.Именно поэтому я пытался заставить вас разглашать HTML, который вы пытаетесь разобрать.Сообщение об ошибке указывает, что (первым) проблемным байтом является \xae, который определенно НЕ является действительным начальным байтом в последовательности UTF-8.

Либо разглашите ссылку на ваш HTML, либо выполните некоторую базовую отладку:

Работает ли uc = html.decode('utf8') или нет?Если не получилось, с каким сообщением об ошибке?

Вы также сказали: "" "Я начинаю думать, что это ошибка в BS, о которой они упоминают в документации, и которую можно увидеть здесь: crummy.ru / software / BeautifulSoup / CHANGELOG.html. "" "

Я не могу представить, на какие из расплывчатых записей в журнале изменений вы ссылаетесь.Прежде чем приступать к обновлению, подумайте об отладке вашей проблемы.

Обновление Похоже на неясную ошибку в файле sgmllib.py.В строке 394 измените 255 на 127, и это, кажется, работает.Угловой регистр: HTML-код ref (&#174;) в значении атрибута И со 128 <= ordinal <255. </p>

Дополнительные комментарии Вместо того, чтобы взломать вашу копию sgmllib.py, возьмите aкопия последнего sgmllib.py из ветки 2.7 - BS 3.0.4 для меня работала нормально на Python 2.7.1.Еще лучше, обновите свой Python до 2.7.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...