scraping how from examples python beautifulsoup

how - python beautifulsoup find element



HTML procesado a texto plano usando Python (2)

Estoy tratando de convertir un trozo de texto HTML con BeautifulSoup. Aquí hay un ejemplo:

<div> <p> Some text <span>more text</span> even more text </p> <ul> <li>list item</li> <li>yet another list item</li> </ul> </div> <p>Some other text</p> <ul> <li>list item</li> <li>yet another list item</li> </ul>

Intenté hacer algo como:

def parse_text(contents_string) Newlines = re.compile(r''[/r/n]/s+'') bs = BeautifulSoup.BeautifulSoup(contents_string, convertEntities=BeautifulSoup.BeautifulSoup.HTML_ENTITIES) txt = bs.getText(''/n'') return Newlines.sub(''/n'', txt)

... pero de esa manera mi elemento span está siempre en una nueva línea. Este es, por supuesto, un ejemplo simple. ¿Hay una manera de obtener el texto en la página HTML como la forma en que se procesará en el navegador (no se requieren reglas de CSS, solo se representan los elementos div, span, li, etc. de forma regular) en Python?


BeautifulSoup es una biblioteca de raspado, por lo que probablemente no sea la mejor opción para hacer la representación HTML. Si no es esencial usar BeautifulSoup, debería echar un vistazo a html2text . Por ejemplo:

import html2text html = open("foobar.html").read() print html2text.html2text(html)

Esto produce:

Some text more text even more text * list item * yet another list item Some other text * list item * yet another list item


Estaba encontrando el mismo problema al intentar analizar el HTML renderizado. Básicamente parece que BS no es el paquete ideal para esto. @Del da la gran solución html2text.

En una pregunta SO diferente: BeautifulSoup get_text no elimina todas las etiquetas y JavaScript @Helge mencionado usando nltk. Desafortunadamente, nltk parece estar descontinuando este método.

Probé tanto html2text como nltk.clean_html y me sorprendieron los resultados de los tiempos, por lo que pensé que justificaban una respuesta para la posteridad. Por supuesto, las velocidades dependen mucho del contenido de los datos ...

Respuesta de @Helge (nltk).

import nltk %timeit nltk.clean_html(html) was returning 153 us per loop

Funcionó muy bien para devolver una cadena con html renderizado. Este módulo nltk era más rápido que incluso html2text, aunque quizás html2text es más robusto.

Responde arriba de @del

betterHTML = html.decode(errors=''ignore'') %timeit html2text.html2text(betterHTML) %3.09 ms per loop