Domanda

Sto cercando di analizzare una pagina html con BeautifulSoup, ma sembra che a BeautifulSoup non piaccia affatto l'html o quella pagina. Quando eseguo il codice di seguito, il metodo prettify () mi restituisce solo il blocco di script della pagina (vedi sotto). Qualcuno ha un'idea del perché accada?

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

Questo è l'output prodotto da 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>

Grazie!

AGGIORNAMENTO: sto usando la seguente versione, che sembra essere l'ultima.

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

Soluzione

Prova con la versione 3.0.7a come & # 321; ukasz suggerito. BeautifulSoup 3.1 è stato progettato per essere compatibile con Python 3.0, quindi hanno dovuto cambiare il parser da SGMLParser a HTMLParser che sembra più vulnerabile a HTML non valido.

Dal log delle modifiche per BeautifulSoup 3.1 :

" Beautiful Soup ora è basato su HTMLParser piuttosto che su SGMLParser, che è andato in Python 3. C'è qualche brutto HTML che SGMLParser ha gestito ma HTMLParser non "

Altri suggerimenti

Prova lxml . Nonostante il suo nome, è anche per l'analisi e lo scraping dell'HTML. È molto, molto più veloce di BeautifulSoup e gestisce anche & Quot; rotto & Quot; HTML migliore di BeautifulSoup, quindi potrebbe funzionare meglio per te. Ha un'API di compatibilità anche per BeautifulSoup se non vuoi imparare l'API lxml.

Ian Blicking è d'accordo .

Non c'è più motivo di utilizzare BeautifulSoup, a meno che tu non sia su Google App Engine o qualcosa in cui non sia consentito nulla che non sia puramente Python.

BeautifulSoup non è magico: se l'HTML in arrivo è troppo orribile, allora non funzionerà.

In questo caso, l'HTML in arrivo è esattamente questo: troppo rotto per BeautifulSoup per capire cosa fare. Ad esempio contiene markup come:

SCRIPT type = " " javascript " "

(Nota la doppia citazione.)

I documenti BeautifulSoup contengono una sezione che cosa puoi fare se BeautifulSoup non è in grado di analizzare il markup. Dovrai studiare queste alternative.

Samj: se ottengo cose del genere HTMLParser.HTMLParseError: bad end tag: u"</scr' + 'ipt>" Rimuovo il colpevole dal markup prima di inviarlo a BeautifulSoup e tutto è dandy:

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

Ho avuto problemi anche ad analizzare il seguente codice:

<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: tag di bad end: u '', alla riga 26, colonna 127

Sam

Ho testato questo script su BeautifulSoup versione '3.0.7a' e restituisce quello che sembra essere l'output corretto. Non so cosa sia cambiato tra '3.0.7a' e '3.1.0.1', ma provalo.

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

Nel mio caso eseguendo le istruzioni precedenti, restituisce l'intera pagina HTML.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top