Проблемы с разбором BeautifulSoup

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

import urllib2
from BeautifulSoup import BeautifulSoup

url = "http://www.futureshop.ca/catalog/subclass.asp?catid=10607&mfr=&logon=&langid=FR&sort=0&page=1"
html = "".join(urllib2.urlopen(url).readlines())
print "-- HTML ------------------------------------------"
print html
print "-- BeautifulSoup ---------------------------------"
print BeautifulSoup(html).prettify()

Это результат, созданный BeautifulSoup.

-- BeautifulSoup ---------------------------------
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<script language="JavaScript">
 <!--
     function highlight(img) {
       document[img].src = "/marketing/sony/images/en/" + img + "_on.gif";
     }

     function unhighlight(img) {
       document[img].src = "/marketing/sony/images/en/" + img + "_off.gif";
     }
//-->
</script>

Спасибо!

ОБНОВЛЕНИЕ: я использую следующую версию, которая кажется последней.

__author__ = "Leonard Richardson ([email protected])"
__version__ = "3.1.0.1"
__copyright__ = "Copyright (c) 2004-2009 Leonard Richardson"
__license__ = "New-style BSD"

person Martin    schedule 02.03.2009    source источник


Ответы (7)


Попробуйте использовать версию 3.0.7a, как предложил Лукаш. BeautifulSoup 3.1 был разработан для совместимости с Python 3.0, поэтому им пришлось изменить синтаксический анализатор с SGMLParser на HTMLParser, который кажется более уязвимым для плохого HTML.

Из журнала изменений для BeautifulSoup 3.1:

«Beautiful Soup теперь основан на HTMLParser, а не на SGMLParser, которого нет в Python 3. Есть некоторый плохой HTML, который SGMLParser обрабатывал, а HTMLParser — нет».

person miles82    schedule 02.03.2009
comment
Еще немного информации об этом здесь: crummy.com/software/BeautifulSoup/3.1-problems .html - person FeatureCreep; 21.11.2009

Попробуйте lxml. Несмотря на свое название, он также предназначен для анализа и очистки HTML. Это намного, намного быстрее, чем BeautifulSoup, и даже обрабатывает «сломанный» HTML лучше, чем BeautifulSoup, поэтому он может работать лучше для вас. Он также имеет API совместимости для BeautifulSoup, если вы не хотите изучать API lxml.

Ян Бликинг соглашается.

Больше нет причин использовать BeautifulSoup, если только вы не используете Google App Engine или что-то еще, где не разрешено ничего, кроме Python.

person aehlke    schedule 03.08.2009

BeautifulSoup — это не волшебство: если входящий HTML-код слишком ужасен, он не будет работать.

В данном случае входящий HTML-код именно такой: слишком сломанный, чтобы BeautifulSoup мог понять, что делать. Например, он содержит разметку вида:

Тип СКРИПТА=""javascript""

(Обратите внимание на двойные кавычки.)

Документы BeautifulSoup содержат раздел, что вы можете сделать, если BeautifulSoup не может проанализировать вашу разметку. Вам нужно изучить эти альтернативы.

person Justus    schedule 02.03.2009

Samj: Если я получаю такие вещи, как HTMLParser.HTMLParseError: bad end tag: u"</scr' + 'ipt>", я просто удаляю виновника из разметки, прежде чем передать его в BeautifulSoup, и все отлично:

html = urllib2.urlopen(url).read()
html = html.replace("</scr' + 'ipt>","")
soup = BeautifulSoup(html)
person fmalina    schedule 13.07.2010

У меня также были проблемы с разбором следующего кода:

<script>
        function show_ads() {
          document.write("<div><sc"+"ript type='text/javascript'src='http://pagead2.googlesyndication.com/pagead/show_ads.js'></scr"+"ipt></div>");
        }
</script>

HTMLParseError: неверный конечный тег: u'', строка 26, столбец 127

Сэм

person Community    schedule 20.04.2009

Я протестировал этот скрипт на версии BeautifulSoup «3.0.7a», и он возвращает правильный вывод. Я не знаю, что изменилось между «3.0.7a» и «3.1.0.1», но попробуйте.

person Łukasz    schedule 02.03.2009

import urllib
from BeautifulSoup import BeautifulSoup

>>> page = urllib.urlopen('http://www.futureshop.ca/catalog/subclass.asp?catid=10607&mfr=&logon=&langid=FR&sort=0&page=1')
>>> soup = BeautifulSoup(page)
>>> soup.prettify()

В моем случае, выполняя приведенные выше операторы, он возвращает всю HTML-страницу.

person aatifh    schedule 06.03.2009
comment
Просто укажите соответствующую причину, прежде чем голосовать против кого-либо. Это будет немного этично. Ой! если ты не понял мой ответ то да поможет тебе бог - person aatifh; 09.03.2009