2009-03-02 3 views
4

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

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> 

Спасибо!

UPDATE: Я использую следующую версию, которая, по-видимому, является последней.

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

ответ

6

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

От changelog for BeautifulSoup 3.1:

"Beautiful Soup теперь основан на HTMLparser, а не SGMLParser, который ушел в Python 3. Там какая-то плохой HTML, что SGMLParser обрабатываются, но HTMLparser не"

+0

Некоторые подробнее об этом здесь: HTTP: // WWW .crummy.com/software/BeautifulSoup/3.1-problems.html – FeatureCreep

2

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

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

типа SCRIPT = "" JavaScript ""

The BeautifulSoup документы содержит раздел, что вы можете сделать, если BeautifulSoup не может разобрать (обратите внимание на двойное цитирование.) вы разметки. Вам нужно будет изучить эти альтернативы.

0

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

0
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

Просто дайте соответствующую причину перед тем, как проголосовать. Это будет немного этично. Ой! если вы не понимаете моего ответа, тогда Бог может помочь вам – aatifh

1

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

<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: плохой конечный тег: и '', в строке 26, колонка 127

Сэм

4

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

Ian Blicking agrees.

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

2

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

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