¿Puedo segmento de un documento en BeautifulSoup antes de convertirlo en texto basado en mi análisis del documento?

StackOverflow https://stackoverflow.com/questions/866772

  •  22-08-2019
  •  | 
  •  

Pregunta

Tengo algunos archivos html que quiero convertir en texto. He jugado un poco con BeautifulSoup y hecho algunos progresos en la comprensión de cómo utilizar las instrucciones y puede presentar html y volver texto.

Sin embargo, mis archivos tienen una gran cantidad de texto formateado utilizando estructuras de la tabla. Por ejemplo puede ser que tenga un párrafo de texto que se encuentra en una etiqueta TD dentro de conjunto de etiquetas de tabla

<table>
<td> here is some really useful information and there might be other markup tags but
     this information is really textual in my eyes-I want to preserve it
 </td>
</table>

Y luego están los 'clásicos' tablas de datos que tienen dentro del cuerpo de la tabla.

Quiero ser capaz de aplicar un algoritmo a la mesa y establecer algunas reglas que determinan si la tabla se arrancó antes de convertir el documento en texto.

He descubierto la manera de obtener las características de mi mesas- por ejemplo, para obtener el número de cols de cada tabla:

numbCols=[]
for table in soup.findAll('table'):
    rows=[]
    for row in table.findAll('tr'):
        columns=0
        for column in row.findAll('td'):
            columns+=1
        rows.append(columns)
    numbCols.append(rows)

para que pueda operar en numbCols y el uso de la len de cada elemento de la lista y los valores de cada elemento de la lista para analizar las características de mis tablas e identificar los que quiero mantener o descartar.

No estoy viendo una manera elegante de la utilización de esta información con BeautifulSoup para obtener el texto. Creo que lo que estoy tratando de llegar a se supone que analizo numbCols y decido que de los diez tablas en un documento particular, quiero excluir a las tablas 2, 4, 6, y 9. Así que la parte del documento HTML incluye todo excepto aquellos mesas. ¿Cómo puedo segmento de mi sopa de esa manera?

La solución que he llegado con es primero identificar la posición de cada una de las etiquetas de tabla de apertura y cierre mediante finditer y conseguir los vanos y luego comprimir los tramos con los numbCols. entonces puedo usar esta lista para cortar y unir las piezas de mi hilvanar. Una vez terminado esto puedo entonces utilizar BeautifulSoup para convertir el HTML al texto.

Estoy seguro de que yo debería ser capaz de hacer todo esto en BeautifulSoup. Cualquier sugerencia o enlaces a los ejemplos existentes serían grandes. Debo mencionar que mis archivos de origen pueden ser grandes y tengo miles de manejar.

No tenía la respuesta, pero me voy acercando

¿Fue útil?

Solución

El hombre me encanta este producto Suponiendo que en un caso ingenua que quiero borrar todas las tablas que tienen todas las filas con una longitud mayor que la columna 3 Mi respuesta es

for table in soup.findAll('table'):
    rows=[]
    for row in table.findAll('tr'):
        columns=0
        for column in row.findAll('td'):
            columns+=1
            rows.append(columns)
        if max(rows)>3:
          table.delete()

Usted puede hacer ningún tipo de procesamiento que desee en cualquier nivel en ese bucle, sólo es necesario identificar la prueba y obtener el derecho a la instancia de prueba.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top