Frage

Ich versuche, eine HTML-Seite mit BeautifulSoup zu analysieren, aber es scheint, dass BeautifulSoup nicht die HTML mag oder gar die Seite. Wenn ich den Code ausführen, wird die Methode verschönert () gibt mir nur den Skriptblock der Seite (siehe unten). Hat jemand eine Idee hat, warum es passiert?

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()

Das ist die Ausgabe von BeautifulSoup hergestellt.

-- 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>

Danke!

UPDATE: Ich bin mit der folgenden Version, die die neuesten zu sein scheint

.
__author__ = "Leonard Richardson (leonardr@segfault.org)"
__version__ = "3.1.0.1"
__copyright__ = "Copyright (c) 2004-2009 Leonard Richardson"
__license__ = "New-style BSD"
War es hilfreich?

Lösung

mit der Version 3.0.7a Versuchen Sie, wie Łukasz vorgeschlagen. BeautifulSoup 3.1 wurde entwickelt, um mit Python kompatibel sein 3.0 so mußten sie den Parser von SGMLParser zu HTMLParser ändern, die zu schlechten HTML anfälliger zu sein scheinen.

Von den Changelog für BeautifulSoup 3.1 :

„Beautiful Soup basiert nun auf HTMLParser statt SGMLParser, die in Python ist weg 3. Es gibt einige schlechte HTML-Code, SGMLParser behandelt aber HTMLParser nicht“

Andere Tipps

Versuchen Sie lxml . Trotz seines Namens ist es auch für das Parsen und HTML Schaben. Es ist viel, viel schneller als BeautifulSoup, und es Griffe sogar „gebrochen“ HTML besser als BeautifulSoup, so dass es für Sie besser funktionieren könnte. Es hat eine Kompatibilität API für BeautifulSoup auch, wenn Sie nicht die lxml API lernen wollen.

Ian Blicking stimmt .

Es gibt keinen Grund BeautifulSoup mehr zu verwenden, es sei denn, Sie sind auf Google App Engine oder etwas, wo etwas nicht rein Python ist nicht erlaubt.

BeautifulSoup ist keine Zauberei., Wenn die eingehende HTML zu schrecklich ist, dann wird es nicht zur Arbeit gehen

In diesem Fall wird die eingehende HTML ist genau das: auch gebrochen für BeautifulSoup um herauszufinden, was zu tun ist. Zum Beispiel enthält es Markup wie:

SCRIPT type = "" javascript ""

(Man beachte die doppelte zitieren.)

Die BeautifulSoup docs enthält einen Abschnitt, was Sie tun können, wenn BeautifulSoup nicht analysieren können Sie Markup. Sie werden diese Alternativen untersuchen müssen.

Samj: Wenn ich Dinge wie HTMLParser.HTMLParseError: bad end tag: u"</scr' + 'ipt>" Ich entferne nur die Täter von Markup, bevor ich es zu BeautifulSoup dienen und alles ist Dandy:

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

ich Probleme hatte, den folgenden Code Parsen auch:

<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: bad End-Tag: u '', in Zeile 26, Spalte 127

Sam

Getestet habe ich dieses Skript auf BeautifulSoup Version ‚3.0.7a‘ und es gibt, was eine korrekte Ausgabe zu sein scheint. Ich weiß nicht, was zwischen ‚3.0.7a‘ geändert und ‚3.1.0.1‘, sondern es zu versuchen.

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()

In meinem Fall durch die obigen Anweisungen ausgeführt werden, es gibt die gesamte HTML-Seite.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top