Analizando HTML usando Python

Estoy buscando un módulo HTML Parser para Python que pueda ayudarme a obtener las tags en forma de listas / diccionarios / objetos de Python.

Si tengo un documento del formulario:

 Heading  
Something here
Something else

entonces debería darme una forma de acceder a las tags anidadas a través del nombre o id de la etiqueta HTML para que básicamente pueda pedirle que me consiga el contenido / texto en la etiqueta div con class='container' contenido dentro de la etiqueta del body , o algo similar.

Si ha utilizado la función “Inspeccionar elemento” de Firefox (ver HTML), sabría que le ofrece todas las tags de forma anidada como un árbol.

Preferiría un módulo incorporado pero eso podría estar pidiendo demasiado.


Hice 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 ellos detallan la funcionalidad y simplemente terminan como un debate sobre cuál es más rápido / más eficiente.

Básicamente, puedo pedirle que me consiga el contenido / texto en la etiqueta div con class = ‘contenedor’ contenido dentro de la etiqueta del cuerpo, o algo similar.

 try: from BeautifulSoup import BeautifulSoup except ImportError: from bs4 import BeautifulSoup html = #the HTML code you've written above parsed_html = BeautifulSoup(html) print parsed_html.body.find('div', attrs={'class':'container'}).text 

Supongo que no necesita descripciones de rendimiento, solo lea cómo funciona BeautifulSoup. Mira su documentación oficial .

Supongo que lo que estás buscando es piratería :

pyquery: una biblioteca tipo jquery para python.

Un ejemplo de lo que quieres puede ser:

 from pyquery import PyQuery html = # Your HTML CODE pq = PyQuery(html) tag = pq('div#id') # or tag = pq('div.class') print tag.text() 

Y utiliza los mismos selectores que el elemento de inspección de Firefox o Chrome. Por ejemplo:

el selector de elementos es 'div # mw-head.noprint'

El selector de elementos inspeccionados es ‘div # mw-head.noprint’. Así que en pyquery, solo necesitas pasar este selector:

 pq('div#mw-head.noprint') 

Aquí puede leer más sobre diferentes analizadores de HTML en Python y su rendimiento. A pesar de que el artículo está un poco anticuado, todavía le da una buena visión general.

Python HTML parser performance

Recomiendo BeautifulSoup aunque no esté integrado. Solo porque es muy fácil trabajar con ese tipo de tareas. P.ej:

 import urllib2 from BeautifulSoup import BeautifulSoup page = urllib2.urlopen('http://www.google.com/') soup = BeautifulSoup(page) x = soup.body.find('div', attrs={'class' : 'container'}).text 

En comparación con otras bibliotecas de analizadores, lxml es extremadamente rápido:

Y con cssselect también es bastante fácil de usar para raspar páginas HTML:

 from lxml.html import parse doc = parse('http://www.google.com').getroot() for div in doc.cssselect('a'): print '%s: %s' % (div.text_content(), div.get('href')) 

lxml.html Documentación

Recomiendo lxml para analizar HTML. Consulte “Análisis HTML” (en el sitio lxml).

En mi experiencia, Beautiful Soup confunde con un HTML complejo. Creo que eso se debe a que Beautiful Soup no es un analizador, sino un analizador de cadenas muy bueno.

Recomiendo usar la biblioteca justext :

https://github.com/miso-belica/jusText

Uso: Python2:

 import requests import justext response = requests.get("http://planet.python.org/") paragraphs = justext.justext(response.content, justext.get_stoplist("English")) for paragraph in paragraphs: print paragraph.text 

Python3:

 import requests import justext response = requests.get("http://bbc.com/") paragraphs = justext.justext(response.content, justext.get_stoplist("English")) for paragraph in paragraphs: print (paragraph.text) 

Yo usaría EHP

https://github.com/iogf/ehp

Aquí está:

 from ehp import * doc = ''' Heading  
Something here
Something else
''' html = Html() dom = html.feed(doc) for ind in dom.find('div', ('class', 'container')): print ind.text()

Salida:

 Something here Something else