Почему BeautifulSoup выдает этот HTMLParseError? - PullRequest
1 голос
/ 10 июля 2009

Я думал, что BeautifulSoup сможет обрабатывать искаженные документы, но когда я отправил ему источник страницы, была напечатана следующая трассировка:


Traceback (most recent call last):
  File "mx.py", line 7, in 
    s = BeautifulSoup(content)
  File "build\bdist.win32\egg\BeautifulSoup.py", line 1499, in __init__
  File "build\bdist.win32\egg\BeautifulSoup.py", line 1230, in __init__
  File "build\bdist.win32\egg\BeautifulSoup.py", line 1263, in _feed
  File "C:\Python26\lib\HTMLParser.py", line 108, in feed
    self.goahead(0)
  File "C:\Python26\lib\HTMLParser.py", line 150, in goahead
    k = self.parse_endtag(i)
  File "C:\Python26\lib\HTMLParser.py", line 314, in parse_endtag
    self.error("bad end tag: %r" % (rawdata[i:j],))
  File "C:\Python26\lib\HTMLParser.py", line 115, in error
    raise HTMLParseError(message, self.getpos())
HTMLParser.HTMLParseError: bad end tag: u"", at line 258, column 34

Разве это не должно быть в состоянии справиться с такого рода вещами? Если он может справиться с ними, как я мог это сделать? Если нет, есть ли модуль, который может обрабатывать искаженные документы?

РЕДАКТИРОВАТЬ: вот обновление. Я сохранил страницу локально, используя Firefox, и попытался создать объект супа из содержимого файла. Вот где BeautifulSoup терпит неудачу. Если я пытаюсь создать объект супа непосредственно с веб-сайта, он работает. Вот документ, который вызывает проблемы для супа.

Ответы [ 3 ]

5 голосов
/ 11 июля 2009

У меня нормально работало с использованием BeautifulSoup версии 3.0.7. Последняя версия 3.1.0, но на домашней странице BeautifulSoup есть примечание, чтобы попробовать 3.0.7a, если у вас возникли проблемы. Я думаю, что столкнулся с той же проблемой, что и вы, некоторое время назад и вернулся, что решило проблему; Я бы попробовал это.

Если вы хотите придерживаться текущей версии, я предлагаю удалить большой блок <script> в верхней части, поскольку именно здесь происходит ошибка, и поскольку вы все равно не можете проанализировать этот раздел с BeautifulSoup.

1 голос
/ 11 июля 2009

Похоже, проблема
contents = contents.replace(/</g, '&lt;');
в строке 258 плюс аналог
contents = contents.replace(/>/g, '&gt;');
в следующей строке.

Я бы просто использовал re.sub, чтобы заглушить все вхождения r "replace (/ [<>] /" чем-то безобидным, прежде чем кормить его BeautifulSoup ... отойти от BeautifulSoup было бы все равно что выбросить ребенка вода в бане ИМХО.

1 голос
/ 11 июля 2009

По моему опыту, BeautifulSoup не настолько отказоустойчив. Мне пришлось использовать его один раз для небольшого сценария и столкнулся с этими проблемами. Я думаю, что использование регулярного выражения для удаления тегов немного помогло, но в итоге я просто сдался и перенес сценарий на Ruby и Nokogiri.

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