Pregunta

Estaba teniendo problemas para analizar HTML poco fiable con BeautifulSoup. Resulta que el HTMLParser utilizado en las versiones más nuevas es menos tolerante que el SGMLParser utilizado anteriormente.


¿BeautifulSoup tiene algún tipo de modo de depuración? Estoy tratando de descubrir cómo evitar que se bloquee en un HTML desagradable que estoy cargando desde un sitio web malhumorado:

<HTML>
    <HEAD>
        <TITLE>Title</TITLE>
        <HTTP-EQUIV="PRAGMA" CONTENT="NO-CACHE">
    </HEAD>
    <BODY>
        ...
        ...
    </BODY>
</HTML>

BeautifulSoup se rinde después de la etiqueta <HTTP-EQUIV...>

In [1]: print BeautifulSoup(c).prettify()
<html>
 <head>
  <title>
   Title
  </title>
 </head>
</html>

El problema es claramente la etiqueta HTTP-EQUIV, que es realmente una etiqueta muy mal formada <META HTTP-EQUIV="PRAGMA" CONTENT="NO-CACHE">. Evidentemente, necesito especificar esto como cierre automático, pero no importa lo que especifique, no puedo solucionarlo:

In [2]: print BeautifulSoup(c,selfClosingTags=['http-equiv',
                            'http-equiv="pragma"']).prettify()
<html>
 <head>
  <title>
   Title
  </title>
 </head>
</html>

¿Existe un modo de depuración detallado en el que BeautifulSoup me diga lo que está haciendo, para que pueda averiguar qué se trata como el nombre de la etiqueta en este caso?

¿Fue útil?

Solución

Su problema debe ser otra cosa; funciona bien para mí:

In [1]: import BeautifulSoup

In [2]: c = """<HTML>
   ...:     <HEAD>
   ...:         <TITLE>Title</TITLE>
   ...:         <HTTP-EQUIV="PRAGMA" CONTENT="NO-CACHE">
   ...:     </HEAD>
   ...:     <BODY>
   ...:         ...
   ...:         ...
   ...:     </BODY>
   ...: </HTML>
   ...: """

In [3]: print BeautifulSoup.BeautifulSoup(c).prettify()
<html>
 <head>
  <title>
   Title
  </title>
  <http-equiv>
  </http-equiv>
 </head>
 <body>
  ...
        ...
 </body>
</html>


In [4]: 

Esto es Python 2.5.2 con BeautifulSoup 3.0.7a & # 8212; tal vez es diferente en versiones anteriores / nuevas? Este es exactamente el tipo de sopa que BeautifulSoup maneja tan bien, así que dudo que se haya cambiado en algún momento & # 8230; ¿Hay algo más en la estructura que no haya mencionado en el problema?

Otros consejos

¿Tiene problemas con Beautiful Soup 3.1.0? recomienda use el analizador de html5lib como una solución alternativa.

#!/usr/bin/env python
from html5lib import HTMLParser, treebuilders

parser = HTMLParser(tree=treebuilders.getTreeBuilder("beautifulsoup"))

c = """<HTML>
    <HEAD>
        <TITLE>Title</TITLE>
        <HTTP-EQUIV="PRAGMA" CONTENT="NO-CACHE">
    </HEAD>
    <BODY>
        ...
        ...
    </BODY>
</HTML>"""

soup = parser.parse(c)
print soup.prettify()

Salida:

<html>
 <head>
  <title>
   Title
  </title>
 </head>
 <body>
  <http-equiv="pragma" content="NO-CACHE">
   ...
        ...
  </http-equiv="pragma">
 </body>
</html>

El resultado muestra que html5lib no ha solucionado el problema en este caso.

Pruebe lxml (y su módulo html). 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. 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.

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