Проблемы с разбором BeautifulSoup - PullRequest
4 голосов
/ 02 марта 2009

Я пытаюсь проанализировать 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"

Ответы [ 7 ]

6 голосов
/ 02 марта 2009

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

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

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

3 голосов
/ 03 августа 2009

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

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

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

2 голосов
/ 14 июля 2010

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

html = urllib2.urlopen(url).read()
html = html.replace("</scr' + 'ipt>","")
soup = BeautifulSoup(html)
2 голосов
/ 02 марта 2009

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

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

SCRIPT type = "" javascript ""

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

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

1 голос
/ 20 апреля 2009

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

<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

Sam

0 голосов
/ 06 марта 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-страницу.

0 голосов
/ 02 марта 2009

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

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