Pregunta

Estoy tratando de analizar una página html con BeautifulSoup, pero parece que a BeautifulSoup no le gusta el html o esa página. Cuando ejecuto el siguiente código, el método prettify () me devuelve solo el bloque de script de la página (ver más abajo). ¿Alguien tiene una idea de por qué sucede?

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

El es el resultado producido por 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>

¡Gracias!

ACTUALIZACIÓN: estoy usando la siguiente versión, que parece ser la última.

__author__ = "Leonard Richardson (leonardr@segfault.org)"
__version__ = "3.1.0.1"
__copyright__ = "Copyright (c) 2004-2009 Leonard Richardson"
__license__ = "New-style BSD"
¿Fue útil?

Solución

Pruebe con la versión 3.0.7a como & # 321; ukasz sugerido. BeautifulSoup 3.1 fue diseñado para ser compatible con Python 3.0, por lo que tuvieron que cambiar el analizador de SGMLParser a HTMLParser, que parece más vulnerable a HTML incorrecto.

Del registro de cambios para BeautifulSoup 3.1 :

" Beautiful Soup ahora se basa en HTMLParser en lugar de SGMLParser, que se ha ido en Python 3. Hay algún HTML incorrecto que SGMLParser manejó pero HTMLParser no "

Otros consejos

Pruebe lxml . A pesar de su nombre, también es para analizar y raspar HTML. Es mucho, mucho más rápido que BeautifulSoup, e incluso maneja & "; Roto &"; HTML mejor que BeautifulSoup, por lo que podría funcionar mejor para usted. También tiene una API de compatibilidad para BeautifulSoup si no desea aprender la API lxml.

Ian Blicking está de acuerdo .

Ya no hay razón para usar BeautifulSoup, a menos que esté en Google App Engine o algo en lo que no se permita nada que no sea Python.

BeautifulSoup no es mágico: si el HTML entrante es demasiado horrible, entonces no funcionará.

En este caso, el HTML entrante es exactamente eso: demasiado roto para que BeautifulSoup descubra qué hacer. Por ejemplo, contiene marcas como:

SCRIPT type = " " javascript " "

(Observe la cita doble).

Los documentos de BeautifulSoup contienen una sección de lo que puede hacer si BeautifulSoup no puede analizar su marcado. Tendrá que investigar esas alternativas.

Samj: Si consigo cosas como HTMLParser.HTMLParseError: bad end tag: u"</scr' + 'ipt>" Simplemente elimino al culpable del marcado antes de servirlo a BeautifulSoup y todo es excelente:

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

También tuve problemas al analizar el siguiente código:

<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: etiqueta de finalización incorrecta: u '', en la línea 26, columna 127

Sam

Probé este script en BeautifulSoup versión '3.0.7a' y devuelve lo que parece ser la salida correcta. No sé qué cambió entre '3.0.7a' y '3.1.0.1', pero pruébelo.

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

En mi caso, al ejecutar las declaraciones anteriores, devuelve la página HTML completa.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top