Me gustaría extraer el texto de un archivo HTML usando Python. Quiero esencialmente el mismo resultado que obtendría si copiara el texto de un navegador y lo pegue en el bloc de notas.
Me gustaría algo más robusto que usar expresiones regulares que pueden fallar en HTML mal formado. He visto a muchas personas recomendar Beautiful Soup, pero he tenido algunos problemas para usarlo. Por un lado, recogió texto no deseado, como la fuente de JavaScript. Además, no interpretó entidades HTML. Por ejemplo, esperaría & # 39; en la fuente HTML para convertirlo en un apóstrofe en el texto, como si hubiera pegado el contenido del navegador en el bloc de notas.
La actualización html2text
parece prometedora. Maneja las entidades HTML correctamente e ignora JavaScript. Sin embargo, no produce exactamente texto plano; produce rebajas que luego tendrían que convertirse en texto sin formato. Viene sin ejemplos ni documentación, pero el código se ve limpio.
Preguntas relacionadas:
fuente
Respuestas:
html2text es un programa de Python que hace un trabajo bastante bueno en esto.
fuente
El mejor fragmento de código que encontré para extraer texto sin obtener JavaScript o cosas no deseadas:
Solo tiene que instalar BeautifulSoup antes:
fuente
text = soup.get_text(separator=' ')
soup.get_text()
que solíasoup.body.get_text()
, para no obtener ningún texto del<head
elemento>, como el título.from urllib.request import urlopen
NOTA: NTLK ya no admite la
clean_html
funciónRespuesta original a continuación, y una alternativa en las secciones de comentarios.
Use NLTK
Perdí mis 4-5 horas arreglando los problemas con html2text. Afortunadamente pude encontrar NLTK.
Funciona por arte de magia.
fuente
raise NotImplementedError ("To remove HTML markup, use BeautifulSoup's get_text() function")
Me encontré enfrentando el mismo problema hoy. Escribí un analizador HTML muy simple para eliminar el contenido entrante de todas las marcas, devolviendo el texto restante con solo un mínimo de formato.
fuente
&
no se convertirá en&
, ¿verdad?from html.parser import HTMLParser
Aquí hay una versión de la respuesta de xperroni que es un poco más completa. Omite secciones de guiones y estilos y traduce charrefs (por ejemplo, & # 39;) y entidades HTML (por ejemplo, & amp;).
También incluye un convertidor inverso trivial de texto plano a HTML.
fuente
Sé que hay una gran cantidad de respuestas ya, pero el más elegentPackage y Pythonic solución que he encontrado es descrita, en parte, aquí .
Actualizar
Según el comentario de Fraser, aquí hay una solución más elegante:
fuente
text = ''.join(BeautifulSoup(some_html_string, "lxml").findAll(text=True))
clean_text = ''.join(BeautifulSoup(some_html_string, "html.parser").stripped_strings
También puede usar el método html2text en la biblioteca de stripogram.
Para instalar stripogram, ejecute sudo easy_install stripogram
fuente
Hay una biblioteca de patrones para la minería de datos.
http://www.clips.ua.ac.be/pages/pattern-web
Incluso puedes decidir qué etiquetas guardar:
fuente
PyParsing hace un gran trabajo. La wiki de PyParsing fue eliminada, así que aquí hay otra ubicación donde hay ejemplos del uso de PyParsing ( enlace de ejemplo ). Una razón para invertir un poco de tiempo con el pirateo es que también ha escrito un manual muy breve, muy bien organizado, O'Reilly Short Cut, que también es económico.
Dicho esto, uso mucho BeautifulSoup y no es tan difícil tratar los problemas de las entidades, puedes convertirlos antes de ejecutar BeautifulSoup.
Buena suerte
fuente
Esta no es exactamente una solución de Python, pero convertirá el texto que Javascript generaría en texto, lo que creo que es importante (por ejemplo, google.com). El navegador Enlaces (no Lynx) tiene un motor Javascript y convertirá la fuente a texto con la opción -dump.
Entonces podrías hacer algo como:
fuente
En lugar del módulo HTMLParser, consulte htmllib. Tiene una interfaz similar, pero hace más del trabajo por usted. (Es bastante antiguo, por lo que no es de mucha ayuda en términos de deshacerse de javascript y css. Podría crear una clase derivada, y agregar métodos con nombres como start_script y end_style (consulte los documentos de Python para más detalles), pero es difícil hacer esto de manera confiable para HTML mal formado.) De todos modos, aquí hay algo simple que imprime el texto plano en la consola
fuente
Recomiendo un paquete de Python llamado goose-extractor Goose intentará extraer la siguiente información:
Texto principal de un artículo Imagen principal del artículo Cualquier película de Youtube / Vimeo incrustada en el artículo Meta Descripción Metaetiquetas
Más: https://pypi.python.org/pypi/goose-extractor/
fuente
Si necesita más velocidad y menos precisión, puede usar lxml sin formato.
fuente
instalar html2text usando
luego,
fuente
Sé que ya hay muchas respuestas aquí, pero creo que el periódico3k también merece una mención. Recientemente necesitaba completar una tarea similar de extraer el texto de los artículos en la web y esta biblioteca ha hecho un excelente trabajo para lograr esto hasta ahora en mis pruebas. Ignora el texto que se encuentra en los elementos del menú y las barras laterales, así como cualquier JavaScript que aparece en la página como lo solicita el OP.
Si ya tiene los archivos HTML descargados, puede hacer algo como esto:
Incluso tiene algunas características de PNL para resumir los temas de los artículos:
fuente
Hermosa sopa convierte entidades html. Probablemente sea su mejor opción teniendo en cuenta que HTML a menudo tiene errores y está lleno de problemas de codificación Unicode y HTML. Este es el código que uso para convertir HTML a texto sin formato:
fuente
Otra opción es ejecutar el html a través de un navegador web basado en texto y volcarlo. Por ejemplo (usando Lynx):
Esto se puede hacer dentro de un script de Python de la siguiente manera:
No le dará exactamente el texto del archivo HTML, pero dependiendo de su caso de uso, puede ser preferible a la salida de html2text.
fuente
Lo que mejor funcionó para mí son las inscripciones.
https://github.com/weblyzard/inscriptis
Los resultados son realmente buenos.
fuente
Otra solución que no es Python: Libre Office:
La razón por la que prefiero esta sobre otras alternativas es que cada párrafo HTML se convierte en una sola línea de texto (sin saltos de línea), que es lo que estaba buscando. Otros métodos requieren post-procesamiento. Lynx produce una buena salida, pero no exactamente lo que estaba buscando. Además, Libre Office se puede usar para convertir de todo tipo de formatos ...
fuente
Alguien ha intentado
bleach.clean(html,tags=[],strip=True)
con lejía ? Me está funcionando.fuente
He tenido buenos resultados con Apache Tika . Su propósito es la extracción de metadatos y texto del contenido, por lo tanto, el analizador subyacente se ajusta en consecuencia de forma inmediata.
Tika se puede ejecutar como un servidor , es trivial ejecutar / implementar en un contenedor Docker, y desde allí se puede acceder a través de enlaces de Python .
fuente
de una manera simple
este código encuentra todas las partes del html_text comenzadas con '<' y terminando con '>' y reemplaza todas las encontradas por una cadena vacía
fuente
La respuesta de @ PeYoTIL usando BeautifulSoup y eliminando el estilo y el contenido del script no funcionó para mí. Lo intenté usando en
decompose
lugar deextract
pero todavía no funcionó. Así que creé el mío, que también formatea el texto usando las<p>
etiquetas y reemplaza las<a>
etiquetas con el enlace href. También hace frente a enlaces dentro del texto. Disponible en esta esencia con un documento de prueba incrustado.fuente
get_text
simplemente no lo corta.En Python 3.x puede hacerlo de una manera muy sencilla importando paquetes 'imaplib' y 'email'. Aunque esta es una publicación anterior, tal vez mi respuesta pueda ayudar a los recién llegados en esta publicación.
Ahora puede imprimir la variable del cuerpo y estará en formato de texto sin formato :) Si es lo suficientemente bueno para usted, sería bueno seleccionarlo como respuesta aceptada.
fuente
text/plain
parte de un correo electrónico si alguien más puso una allí. No hace nada para convertir el HTML en texto sin formato, y no hace nada remotamente útil si está intentando convertir HTML de, por ejemplo, un sitio web.puedes extraer solo texto de HTML con BeautifulSoup
fuente
Si bien muchas personas mencionaron el uso de expresiones regulares para eliminar las etiquetas html, hay muchas desventajas.
por ejemplo:
Debe analizarse para:
Aquí hay un fragmento que se me ocurrió, puedes personalizarlo según tus necesidades específicas, y funciona de maravilla
fuente
Otro ejemplo usando BeautifulSoup4 en Python 2.7.9+
incluye:
Código:
Explicado:
Lea los datos de la URL como html (usando BeautifulSoup), elimine todos los elementos de estilo y script, y también obtenga solo el texto usando .get_text (). Divida en líneas y elimine el espacio inicial y final de cada una, luego divida los encabezados múltiples en una línea cada uno = (frase.strip () para línea en línea para frase en línea.split ("")). Luego, usando text = '\ n'.join, suelte líneas en blanco, finalmente regrese como sancionado utf-8.
Notas:
Algunos sistemas en los que se ejecuta fallarán con las conexiones https: // debido a un problema de SSL, puede desactivar la verificación para solucionar ese problema. Solución de ejemplo: http://blog.pengyifan.com/how-to-fix-python-ssl-certificate_verify_failed/
Python <2.7.9 puede tener algún problema al ejecutar esto
text.encode ('utf-8') puede dejar una codificación extraña, puede que solo desee devolver str (text) en su lugar.
fuente
Aquí está el código que uso regularmente.
Espero que eso ayude.
fuente
El comentario del escritor de LibreOffice tiene mérito ya que la aplicación puede emplear macros de Python. Parece ofrecer múltiples beneficios tanto para responder a esta pregunta como para ampliar la base macro de LibreOffice. Si esta resolución es una implementación única, en lugar de usarse como parte de un programa de producción mayor, abrir el HTML en el escritor y guardar la página como texto parecería resolver los problemas discutidos aquí.
fuente
Perl way (lo siento mamá, nunca lo haré en producción).
fuente