He encontrado HTMLParser para saxo y xml.minidom para xml. Tengo un muy bien formado html por lo que no necesito demasiado fuerte parser, alguna sugerencia?

InformationsquelleAutor Guy | 2010-05-06

4 Comentarios

  1. 12

    Echa un vistazo a BeautifulSoup. Es popular y excelente en el análisis de HTML.

    • no está construido en si no me equivoco
    • No, no es integrada. Pero se puede instalar fácilmente utilizando easy_install o simplemente descargar desde el sitio web y poner en PYTHONPATH. Todo BeautifulSoup está contenida en un solo archivo, por lo que no es mucho de una carga.
    • BeautifulSoup se supone analizar HTML sucio no «bastante bien formado» uno.
    • He añadido un ejemplo de uso de la builtin xml.dom.minidom, que responde a la pregunta original.
  2. 26

    Yo recomendaría lxml. Me gusta BeautifulSoup, pero hay problemas de mantenimiento en general y de los problemas de compatibilidad con las versiones posteriores. He sido feliz usando lxml.


    Más tarde: las mejores recomendaciones para la utilización de lxml, html5lib, o BeautifulSoup 3.0.8. BeautifulSoup 3.1.x es para python 3.x y se sabe que tiene problemas con anteriores versiones de python, como se señaló en la BeautifulSoup sitio web.

    Ian Bicicleta tiene un buen artículo sobre el uso de lxml.

    ElementTree es una recomendación más, pero nunca lo he usado.


    2012-01-18: alguien ha llegado y decidimos downvote mí y Bartosz porque nos recomienda los paquetes de python que se obtienen fácilmente, pero no la parte de la distribución de python. Así que para los muy literal StackOverflowers: «puede utilizar xml.dom.minidom, pero a nadie le recomendamos este sobre las alternativas.»

    • para lo que vale, he intentado analizar algunos de HTML utilizando tanto ElementTree y xml minidom, y ambos se atragantó con errores de análisis en las etiquetas de script (javascript)!
    • Acabo de añadir una respuesta con un ejemplo de trabajo de xml.dom.minidom. En algunas situaciones, la instalación de un módulo externo es gravosa o imposible. Además de que es lo que a la pregunta original, pidió.
  3. 17

    BeautifulSoup y lxml son grandes, pero no es apropiado respuestas aquí, ya que la pregunta es acerca de builtins. Aquí es un ejemplo del uso de la builtin minidom para parsear HTML de una cadena. Probado con cPython 3.5.2:

    from xml.dom.minidom import parseString
    
    html_string = """
    <!DOCTYPE html>
    <html><head><title>title</title></head><body><p>test</p></body></html>
    """
    
    # extract the text value of the document's <p> tag:
    doc = parseString(html_string)
    paragraph = doc.getElementsByTagName("p")[0]
    content = paragraph.firstChild.data
    
    print(content)

    Sin embargo, como se indica en Jesse Hogan comentario, esto se producirá en entidades HTML no reconocido por mindom. Aquí es una solución actualizada mediante el Python3 html.analizador de módulo:

    from html.parser import HTMLParser
    
    html_string = """
    <!DOCTYPE html>
    <html><head><title>title</title></head><body><p>&nbsp;test</p><div>not in p</div></body></html>
    """
    
    class Parser(HTMLParser):
        def __init__(self):
            HTMLParser.__init__(self)
            self.in_p = []
    
        def handle_starttag(self, tag, attrs):
            if (tag == 'p'):
                self.in_p.append(tag)
    
        def handle_endtag(self, tag):
            if (tag == 'p'):
                self.in_p.pop()
    
        def handle_data(self, data):
            if self.in_p:
                print("<p> data :", data)
    
    parser = Parser()
    parser.feed(html_string)
    • Esto podría provocar una excepción en común entidades HTML como &nbsp; o &reg;.

Dejar respuesta

Please enter your comment!
Please enter your name here