Question

J'essaie d'analyser une page html avec BeautifulSoup, mais il semble que BeautifulSoup n'aime pas le html ou cette page. Lorsque j'exécute le code ci-dessous, la méthode prettify () ne me renvoie que le bloc de script de la page (voir ci-dessous). Est-ce que quelqu'un a une idée pourquoi cela se produit?

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

Ceci est la sortie produite par 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>

Merci!

UPDATE: J'utilise la version suivante, qui semble être la dernière.

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

La solution

Essayez avec la version 3.0.7a comme & # 321; ukasz suggéré. BeautifulSoup 3.1 a été conçu pour être compatible avec Python 3.0. Il a donc fallu changer l’analyseur de SGMLParser en HTMLParser, qui semble plus vulnérable aux mauvais codes HTML.

Extrait du journal des modifications de BeautifulSoup 3.1 :

& "; Beautiful Soup est maintenant basé sur HTMLParser plutôt que sur SGMLParser, qui a disparu dans Python 3. Il existe du mauvais HTML que SGMLParser a géré mais HTMLParser ne le &";

Autres conseils

Essayez lxml . En dépit de son nom, il est également destiné à l’analyse et au grattage de HTML. C'est beaucoup, beaucoup plus rapide que BeautifulSoup, et il gère même & "Cassé &"; HTML mieux que BeautifulSoup, il pourrait donc fonctionner mieux pour vous. Il a aussi une API de compatibilité pour BeautifulSoup si vous ne voulez pas apprendre l’API lxml.

Ian Blicking est d'accord .

Il n'y a plus aucune raison d'utiliser BeautifulSoup, sauf si vous êtes sur Google App Engine ou sur quelque chose où tout ce qui n'est pas purement Python n'est pas autorisé.

BeautifulSoup n’est pas magique: si le code HTML entrant est trop horrible, il ne fonctionnera pas.

Dans ce cas, le code HTML entrant correspond exactement à cela: trop brisé pour que BeautifulSoup sache quoi faire. Par exemple, il contient des balises telles que:

SCRIPT type = " " javascript " "

(Notez la double citation.)

La documentation BeautifulSoup contient une section sur ce que vous pouvez faire si BeautifulSoup ne peut pas analyser votre balisage. Vous devrez étudier ces alternatives.

Samj: Si j'obtiens des choses comme HTMLParser.HTMLParseError: bad end tag: u"</scr' + 'ipt>" Je supprime juste le coupable du balisage avant de le servir à BeautifulSoup et tout est dandy:

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

J'ai également eu des problèmes pour analyser le code suivant:

<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: balise de fin incorrecte: u '', ligne 26, colonne 127

Sam

J'ai testé ce script sur la version 3.0.7a de BeautifulSoup et il renvoie ce qui semble être une sortie correcte. Je ne sais pas ce qui a changé entre '3.0.7a' et '3.1.0.1' mais essayez-le.

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

Dans mon cas, en exécutant les instructions ci-dessus, la page HTML entière est renvoyée.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top