tutorial - Análisis de HTML usando Python
using beautifulsoup python (7)
Estoy buscando un módulo analizador de HTML para Python que pueda ayudarme a obtener las etiquetas en forma de listas / diccionarios / objetos de Python.
Si tengo un documento del formulario:
<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 manera de acceder a las etiquetas anidadas a través del nombre o ID de la etiqueta HTML para que básicamente pueda pedirle que me brinde el contenido / texto en la etiqueta div
con class=''container''
contenido dentro de la etiqueta del body
, o algo similar.
Si usaste la función "Examinar elemento" de Firefox (ver HTML), sabrías que te da todas las etiquetas de una manera anidada como un árbol.
Preferiría un módulo integrado, 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 detallan la funcionalidad y simplemente terminan como un debate sobre cuál es más rápido / más eficiente.
Así que básicamente puedo pedirle que me brinde el contenido / texto en la etiqueta div con class = ''container'' contenido dentro de la etiqueta body, 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
No necesita descripciones de rendimiento, supongo. Simplemente lea cómo funciona BeautifulSoup. Mira su documentación oficial .
Aquí puede leer más acerca de los diferentes analizadores de HTML en Python y su rendimiento. A pesar de que el artículo está un poco pasado de moda, todavía le da una buena visión general.
El rendimiento del analizador HTML de Python
Recomendaría BeautifulSoup aunque no esté incorporado. Simplemente 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
Comparado con las otras bibliotecas de analizadores lxml
es extremadamente rápido:
- http://blog.dispatched.ch/2010/08/16/beautifulsoup-vs-lxml-performance/
- http://www.ianbicking.org/blog/2008/03/python-html-parser-performance.html
Y con cssselect
, es bastante fácil de usar para raspar páginas HTML también:
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''))
Recomiendo lxml para analizar HTML. Consulte "Análisis de HTML" (en el sitio lxml).
En mi experiencia, Beautiful Soup estropea algunos HTML complejos. Creo que es porque Beautiful Soup no es un analizador, sino un analizador de cuerdas 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)
Supongo que lo que estás buscando es pyquery :
pyquery: una biblioteca similar a jquery para python.
Un ejemplo de lo que quieres puede ser como:
from pyquery import PyQuery
html = # Your HTML CODE
pq = PyQuery(html)
tag = pq(''div#class'')
print tag.text()
Y usa los mismos selectores que el elemento de inspección de Firefox o Chrome. Por ejemplo:
El selector de elemento inspeccionado es ''div # mw-head.noprint''. Entonces, en Pyquery, solo tienes que pasar este selector:
pq(''div#mw-head.noprint'')
Yo usaría EHP
Aquí está:
from ehp import *
doc = ''''''<html>
<head>Heading</head>
<body attr1=''val1''>
<div class=''container''>
<div id=''class''>Something here</div>
<div>Something else</div>
</div>
</body>
</html>
''''''
html = Html()
dom = html.feed(doc)
for ind in dom.find(''div'', (''class'', ''container'')):
print ind.text()
Salida:
Something here
Something else