Convertir html a texto con Python

Estoy tratando de convertir un bloque html a texto usando Python.

Entrada:

Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa

Consectetuer adipiscing elit. Some Link Aenean commodo ligula eget dolor. Aenean massa

Aenean massa.Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa

Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa

Consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa

Salida deseada:

Lorem ipsum dolor sit amet, consultor adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa

Consectetuer adipiscing elit. Algunos enlaces aen comodo ligula eget dolor. Aenean massa

Aenean massa.Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa

Lorem ipsum dolor sit amet, consultor adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa

Consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa

He intentado usar el módulo html2text sin mucho éxito (soy bastante nuevo en Python :))

Esto es lo que he intentado:

 #!/usr/bin/env python import urllib2 import html2text from BeautifulSoup import BeautifulSoup soup = BeautifulSoup(urllib2.urlopen('http://example.com/page.html').read()) txt = soup.find('div', {'class' : 'body'}) print html2text.html2text(txt) 

el objeto “txt” produce el bloque html anterior. Me gustaría convertirlo en texto e imprimirlo en la pantalla.

Cualquier ayuda con la pieza de código sería muy apreciada.

¿Qué me estoy perdiendo? soup.get_text() da exactamente la misma salida que querías …

 from bs4 import BeautifulSoup soup = BeautifulSoup(html) print soup.get_text() 

salida

 Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa Consectetuer adipiscing elit. Some Link Aenean commodo ligula eget dolor. Aenean massa Aenean massa.Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa Consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa 

¡PD! Para ser exactos, puede reemplazar la nueva línea con una doble – entonces es idéntica a su ejemplo 🙂

 soup.get_text().replace('\n','\n\n') 

Puedes usar expresiones regulares … pero no se recomienda …

El siguiente código simplemente elimina todas las tags HTML en sus datos, dándole el texto.

 import re data = """

Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa

Consectetuer adipiscing elit. Some Link Aenean commodo ligula eget dolor. Aenean massa

Aenean massa.Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa

Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa

Consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa

""" data = re.sub(r'<.*?>', '', data) print data

Salida

 Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa Consectetuer adipiscing elit. Some Link Aenean commodo ligula eget dolor. Aenean massa Aenean massa.Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa Consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa 

El '\n' coloca una nueva línea entre los párrafos.

 from bs4 import Beautifulsoup soup = Beautifulsoup(text) print(soup.get_text('\n')) 

Necesitaba una forma de hacer esto en el sistema de un cliente sin tener que descargar bibliotecas adicionales. Nunca encontré una buena solución, así que creé la mía. Siéntase libre de usar esto si lo desea.

 import urllib def html2text(strText): str1 = strText int2 = str1.lower().find("0: str1 = str1[int2:] int2 = str1.lower().find("") if int2>0: str1 = str1[:int2] list1 = ['
', '', 'li>', '' ] list2 = [chr(13), chr(13), chr(9), chr(13), chr(13), chr(13), chr(13), chr(13)] bolFlag1 = True bolFlag2 = True strReturn = "" for int1 in range(len(str1)): str2 = str1[int1] for int2 in range(len(list1)): if str1[int1:int1+len(list1[int2])].lower() == list1[int2]: strReturn = strReturn + list2[int2] if str1[int1:int1+7].lower() == '': bolFlag2 = True if bolFlag1 and bolFlag2: strReturn = strReturn.replace(chr(32)+chr(13), chr(13)) strReturn = strReturn.replace(chr(9)+chr(13), chr(13)) strReturn = strReturn.replace(chr(13)+chr(32), chr(13)) strReturn = strReturn.replace(chr(13)+chr(9), chr(13)) strReturn = strReturn.replace(chr(13)+chr(13), chr(13)) strReturn = strReturn.replace(chr(13), '\n') return strReturn url = "http://www.theguardian.com/world/2014/sep/25/us-air-strikes-islamic-state-oil-isis" html = urllib.urlopen(url).read() print html2text(html)

Es posible usar BeautifulSoup para eliminar scripts no deseados y similares, aunque es posible que tenga que experimentar con algunos sitios diferentes para asegurarse de haber cubierto los diferentes tipos de cosas que desea excluir. Prueba esto:

 from requests import get from bs4 import BeautifulSoup as BS response = get('http://news.bbc.co.uk/2/hi/health/2284783.stm') soup = BS(response.content, "html.parser") for child in soup.body.children: if child.name == 'script': child.decompose() print(soup.body.get_text())