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