Вопрос

Я пытаюсь проанализировать 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 (leonardr@segfault.org)"
__version__ = "3.1.0.1"
__copyright__ = "Copyright (c) 2004-2009 Leonard Richardson"
__license__ = "New-style BSD"
Это было полезно?

Решение

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

Из список изменений для BeautifulSoup 3.1:

«Beautiful Soup теперь основан на HTMLParser, а не на SGMLParser, которого нет в Python 3.SGMLParser обработал неправильный HTML-код, а HTMLParser — нет"

Другие советы

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

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

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

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

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

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

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

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

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

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

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

<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

Сэм

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

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-страница.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top