tutorial scraping how from examples beautifulsoup4 python parsing html-parsing beautifulsoup

scraping - web scraper python 3



¿Cómo puedo evitar el cierre de etiquetas en HTML incorrecto usando BeautifulSoup(python)? (1)

BeautifulSoup sobresale al analizar y extraer datos de HTML / XML mal formateados, pero si el HTML roto es ambiguo, utiliza un conjunto de reglas para interpretar las etiquetas (que pueden no ser las que usted desea). Consulte la sección sobre Análisis de HTML en los documentos que finaliza con un ejemplo que suena muy similar a su situación.

Si sabes lo que está mal con tus etiquetas y entiendes las reglas que usa BeautifulSoup, es posible que puedas aumentar ligeramente tu HTML (tal vez eliminar o mover ciertas etiquetas) para hacer que BeautifulSoup devuelva el resultado que deseas.

Si puede publicar un breve ejemplo, alguien podría brindarle ayuda más específica.

Actualización (algunos ejemplos)

Por ejemplo, considere el ejemplo dado en los documentos (vinculados arriba):

from BeautifulSoup import BeautifulSoup html = """ <html> <form> <table> <td><input name="input1">Row 1 cell 1 <tr><td>Row 2 cell 1 </form> <td>Row 2 cell 2<br>This</br> sure is a long cell </body> </html>""" print BeautifulSoup(html).prettify()

La etiqueta <table> se cerrará antes de </form> para asegurarse de que la tabla está correctamente anidada dentro del formulario, dejando la última <td> colgada.

Si comprendemos el problema, podemos obtener la pestaña de cierre correcta ( </table> ) eliminando "<form>" antes de analizar:

>>> html = html.replace("<form>", "") >>> soup = BeautifulSoup(html) >>> print soup.prettify() <html> <table> <td> <input name="input1" /> Row 1 cell 1 </td> <tr> <td> Row 2 cell 1 </td> <td> Row 2 cell 2 <br /> This sure is a long cell </td> </tr> </table> </html>

Si la etiqueta <form> ES importante, aún puede agregarla después del análisis. Por ejemplo:

>>> new_form = Tag(soup, "form") # create form element >>> soup.html.insert(0, new_form) # insert form as child of html >>> new_form.insert(0, soup.table.extract()) # move table into form >>> print soup.prettify() <html> <form> <table> <td> <input name="input1" /> Row 1 cell 1 </td> <tr> <td> Row 2 cell 1 </td> <td> Row 2 cell 2 <br /> This sure is a long cell </td> </tr> </table> </form> </html>

Traduzco automáticamente el contenido de páginas HTML a diferentes idiomas, así que tengo que extraer todos los nodos de texto de diferentes páginas HTML que a veces están mal escritas (no tengo la posibilidad de editar estos HTML).

Al usar BeautifulSoup puedo extraer esos textos fácilmente y reemplazarlos con la traducción, pero cuando visualizo HTML después de estas operaciones: html = BeautifulSoup (source_html) - a veces se rompe porque BeautifulSoup cierra automáticamente las etiquetas (por ejemplo, la etiqueta de la tabla se cierra en el lugar incorrecto) .

¿Hay alguna manera de evitar que BeautifulSoup cierre estas etiquetas?

Por ejemplo, esta es mi opinión:

html = "<table><tr><td>some text</td></table>" - falta el cierre tr

after soup = BeautufulSoup (html) obtengo "<table><tr><td>some text</td></tr></table>"

y quiero obtener el mismo html como entrada ...

¿Es posible?