Estoy buscando un módulo HTML Parser para Python que pueda ayudarme a obtener las etiquetas en forma de listas / diccionarios / objetos de Python.
Si tengo un documento de la forma:
<html>
<head>Heading</head>
<body attr1='val1'>
<div class='container'>
<div id='class'>Something here</div>
<div>Something else</div>
</div>
</body>
</html>
entonces debería darme una forma de acceder a las etiquetas anidadas a través del nombre o la identificación de la etiqueta HTML para que básicamente pueda pedirle que me proporcione el contenido / texto en la div
etiqueta class='container'
contenida dentro de la body
etiqueta, o algo similar.
Si ha utilizado la función "Inspeccionar elemento" de Firefox (ver HTML), sabrá que le proporciona todas las etiquetas de una manera agradable y anidada como un árbol.
Prefiero un módulo incorporado, pero eso podría estar pidiendo demasiado.
Revisé muchas preguntas sobre Stack Overflow y algunos blogs en Internet y la mayoría de ellos sugieren BeautifulSoup o lxml o HTMLParser, pero pocos de estos detallan la funcionalidad y simplemente terminan como un debate sobre cuál es más rápido / más eficiente.
fuente
Respuestas:
Supongo que no necesita descripciones de rendimiento, solo lea cómo funciona BeautifulSoup. Mira su documentación oficial .
fuente
from bs4 import BeautifulSoup
lxml
biblioteca en su lugar (vea la respuesta a continuación). Concssselect
su aswell bastante útil y el rendimiento suele ser de 10 a 100 veces mejor que las otras bibliotecas disponibles.class
atributo es especial:BeautifulSoup(html).find('div', 'container').text
Supongo que lo que estás buscando es pyquery :
Un ejemplo de lo que quieres puede ser:
Y utiliza los mismos selectores que el elemento de inspección de Firefox o Chrome. Por ejemplo:
El selector de elementos inspeccionados es 'div # mw-head.noprint'. Entonces, en pyquery, solo necesita pasar este selector:
fuente
Aquí puede leer más sobre los diferentes analizadores HTML en Python y su rendimiento. A pesar de que el artículo está un poco anticuado, todavía le ofrece una buena visión general.
Rendimiento del analizador HTML de Python
Recomiendo BeautifulSoup a pesar de que no está integrado. Solo porque es muy fácil trabajar para ese tipo de tareas. P.ej:
fuente
from bs4 import BeautifulSoup
En comparación con las otras bibliotecas de analizadores,
lxml
es extremadamente rápido:Y
cssselect
también es bastante fácil de usar para raspar páginas HTML:lxml.html Documentación
fuente
import requests
, guarde el búfer en el archivo: stackoverflow.com/a/14114741/1518921 (o urllib), después de cargar el archivo guardado usando parse,doc = parse('localfile.html').getroot()
1.7
segundos, pero al aplicar lxml en su lugar, ¡lo impulsó casi más*100
rápido! Si le importa el rendimiento, lxml es la mejor opciónRecomiendo lxml para analizar HTML. Consulte "Análisis de HTML" (en el sitio lxml).
En mi experiencia, Beautiful Soup se equivoca en algunos HTML complejos. Creo que es porque Beautiful Soup no es un analizador sintáctico, sino un muy buen analizador de cadenas.
fuente
Recomiendo usar la biblioteca justext :
https://github.com/miso-belica/jusText
Uso: Python2:
Python3:
fuente
Usaría EHP
https://github.com/iogf/ehp
Aquí está:
Salida:
fuente