tutorial scraping find_next_sibling examples python beautifulsoup html5lib

find_next_sibling - web scraping python examples



No pongas etiquetas html, cabeza y cuerpo automáticamente, beautifulsoup (5)

Otra solución más:

from bs4 import BeautifulSoup soup = BeautifulSoup(''<p>Hello <a href="http://google.com">Google</a></p><p>Hi!</p>'', ''lxml'') # content handling example (just for example) # replace Google with StackOverflow for a in soup.findAll(''a''): a[''href''] = ''http://stackoverflow.com/'' a.string = ''StackOverflow'' print ''''.join([unicode(i) for i in soup.html.body.findChildren(recursive=False)])

Al usar beautifulsoup con html5lib, coloca las etiquetas html, head y body automáticamente:

BeautifulSoup(''<h1>FOO</h1>'', ''html5lib'') # => <html><head></head><body><h1>FOO</h1></body></html>

¿Hay alguna opción que pueda configurar, desactivar este comportamiento?


Puedes eliminar html y body especificando soup.body.<tag> :

# python3: first child print(next(soup.body.children)) # if first child''s tag is rss print(soup.body.rss)

También puedes usar el desenvolver para quitar el cuerpo, la cabeza y el html

soup.html.body.unwrap() if soup.html.select(''> head''): soup.html.head.unwrap() soup.html.unwrap()

Si carga un archivo xml, bs4.diagnose(data) le indicará que use lxml-xml , que no envolverá su sopa con html+body

>>> BS(''<foo>xxx</foo>'', ''lxml-xml'') <foo>xxx</foo>


Si quieres que se vea mejor, prueba esto:

BeautifulSoup ([contenido que desea analizar]. Interpretar () )


Su única opción es no usar html5lib para analizar los datos.

Esa es una característica de la biblioteca html5lib , corrige el HTML que falta, como agregar elementos faltantes que faltan.


In [35]: import bs4 as bs In [36]: bs.BeautifulSoup(''<h1>FOO</h1>'', "html.parser") Out[36]: <h1>FOO</h1>

Esto analiza el HTML con el analizador HTML incorporado de Python . Citando los documentos:

A diferencia de html5lib, este analizador no intenta crear un documento HTML bien formado al agregar una etiqueta <body> . A diferencia de lxml, ni siquiera se molesta en agregar una etiqueta <html> .

Alternativamente, puede usar el analizador html5lib y simplemente seleccionar el elemento después de <body> :

In [61]: soup = bs.BeautifulSoup(''<h1>FOO</h1>'', ''html5lib'') In [62]: soup.body.next Out[62]: <h1>FOO</h1>