Básicamente, quiero usar BeautifulSoup para tomar estrictamente el texto visible en una página web. Por ejemplo, esta página web es mi caso de prueba. Y principalmente quiero obtener el texto del cuerpo (artículo) y tal vez incluso algunos nombres de pestañas aquí y allá. He intentado la sugerencia en esta pregunta SO que devuelve muchas <script>
etiquetas y comentarios html que no quiero. No puedo entender los argumentos que necesito para la función findAll()
con el fin de obtener los textos visibles en una página web.
Entonces, ¿cómo debo encontrar todo el texto visible, excepto scripts, comentarios, CSS, etc.?
python
text
beautifulsoup
html-content-extraction
usuario233864
fuente
fuente
soup.findAll(text=True)
nunca supo de esa característicaisinstance(element, Comment)
lugar de coincidir con una expresión regular.soup = BeautifulSoup(html)
elif isinstance(element,bs4.element.Comment):
. También agregué 'meta' a la lista de padres.elif re.match(r"[\s\r\n]+",str(element)): return False
La respuesta aprobada de @jbochi no me funciona. La llamada a la función str () genera una excepción porque no puede codificar los caracteres que no son ascii en el elemento BeautifulSoup. Aquí hay una forma más sucinta de filtrar la página web de ejemplo a texto visible.
fuente
str(element)
falla con los problemas de codificación, debería intentarlounicode(element)
si está usando Python 2.fuente
Respeto completamente el uso de Beautiful Soup para obtener contenido renderizado, pero puede que no sea el paquete ideal para adquirir el contenido renderizado en una página.
Tuve un problema similar para obtener contenido renderizado o el contenido visible en un navegador típico. En particular, tuve muchos casos quizás atípicos para trabajar con un ejemplo tan simple a continuación. En este caso, la etiqueta no visualizable está anidada en una etiqueta de estilo, y no está visible en muchos navegadores que he verificado. Existen otras variaciones, como definir una visualización de configuración de etiqueta de clase en none. Luego, usando esta clase para el div.
Una solución publicada anteriormente es:
Esta solución ciertamente tiene aplicaciones en muchos casos y hace el trabajo bastante bien en general, pero en el html publicado arriba retiene el texto que no se muestra. Después de buscar SO, surgieron un par de soluciones BeautifulSoup get_text no elimina todas las etiquetas y JavaScript y aquí se procesó HTML en texto sin formato usando Python
Probé ambas soluciones: html2text y nltk.clean_html y me sorprendieron los resultados de tiempo, así que pensé que justificaban una respuesta para la posteridad. Por supuesto, las velocidades dependen en gran medida del contenido de los datos ...
Una respuesta aquí de @Helge fue sobre usar nltk de todas las cosas.
Funcionó muy bien para devolver una cadena con html procesado. Este módulo nltk fue más rápido que incluso html2text, aunque quizás html2text es más robusto.
fuente
Si te importa el rendimiento, aquí hay otra forma más eficiente:
soup.strings
es un iterador y regresaNavigableString
para que pueda verificar el nombre de la etiqueta del padre directamente, sin pasar por varios bucles.fuente
El título está dentro de una
<nyt_headline>
etiqueta, que está anidada dentro de una<h1>
etiqueta y una<div>
etiqueta con id "artículo".Deberia trabajar.
El cuerpo del artículo está dentro de una
<nyt_text>
etiqueta, que está anidada dentro de una<div>
etiqueta con el ID "articleBody". Dentro del<nyt_text>
elemento, el texto en sí está contenido dentro de las<p>
etiquetas. Las imágenes no están dentro de esas<p>
etiquetas. Es difícil para mí experimentar con la sintaxis, pero espero que un raspado funcional se vea así.fuente
Si bien, sugeriría completamente usar una sopa hermosa en general, si alguien está buscando mostrar las partes visibles de un html con formato incorrecto (por ejemplo, donde solo tiene un segmento o línea de una página web) por cualquier razón, lo siguiente eliminará el contenido entre
<
y>
etiquetas:fuente
Usando BeautifulSoup de la manera más fácil con menos código para obtener las cadenas, sin líneas vacías y basura.
fuente
La forma más sencilla de manejar este caso es mediante el uso
getattr()
. Puede adaptar este ejemplo a sus necesidades:Esto encontrará el elemento de texto
"3.7"
, dentro del objeto de etiqueta<span class="ratingsContent">3.7</span>
cuando existe, sin embargo, predeterminadoNoneType
cuando no existe.fuente
fuente