with tutorial scraping scrap parser con code python xml-parsing html-parsing

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:

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

lxml.html Documentación


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

https://github.com/iogf/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