Puis-je segmenter un document BeautifulSoup avant de le convertir en texte basé sur mon analyse du document?

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

  •  22-08-2019
  •  | 
  •  

Question

J'ai des fichiers html que je veux convertir en texte. Je l'ai joué avec BeautifulSoup et fait quelques progrès sur la compréhension de la façon d'utiliser les instructions et peuvent soumettre html et obtenir un texte en arrière.

Cependant, mes fichiers ont beaucoup de texte qui est formaté en utilisant des structures de table. Par exemple, je pourrais avoir un paragraphe de texte qui se trouve dans une balise td au sein des balises de table

<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>

Et puis il y a les « tables classiques » qui ont des données dans le corps de la table.

Je veux être en mesure d'appliquer un algorithme à la table et définir des règles qui déterminent si la table est arraché avant de convertir le document en texte.

Je l'ai compris comment obtenir les caractéristiques de mon Tableaux- par exemple pour obtenir le nombre de colonnes dans chaque table:

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)

Je peux fonctionner sur numbCols et utiliser le len de chaque élément dans la liste et les valeurs de chaque élément dans la liste pour analyser les caractéristiques de mes tableaux et d'identifier ceux que je veux garder ou jeter.

Je ne vois pas une façon élégante de l'utilisation de cette information avec BeautifulSoup pour obtenir le texte. Je suppose que ce que je suis en train de dire, c'est suppose que j'analyse numbCols et décide que des dix tables dans un document particulier, je veux exclure les tableaux 2, 4, 6, et 9. Ainsi, la partie du document HTML comprend tout sauf les les tables. Comment puis-je segmenter mon soupe de cette façon?

La solution que je suis venu avec est d'identifier d'abord la position de chacune des étiquettes de table ouvrir et fermer à l'aide finditer et obtenir les travées et passer comme un éclair, puis les travées avec les numbCols. Je peux ensuite utiliser cette liste pour couper et assembler les morceaux de ma chaîne. Une fois terminé, je peux alors utiliser BeautifulSoup pour convertir le HTML au texte.

Je suis sûr que je serais capable de faire tout cela en BeautifulSoup. Toutes les suggestions ou des liens vers des exemples existants seraient grands. Je dois mentionner que mes fichiers source peuvent être importants et je milliers de personnes à gérer.

Je n'ai pas la réponse, mais je me rapproche

Était-ce utile?

La solution

Man I love ce genre de choses En supposant dans un cas naïf que je veux supprimer toutes les tables qui ont toutes les lignes d'une longueur de colonne supérieure à 3 Ma réponse est

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()

Vous pouvez faire tout traitement que vous voulez à tout niveau dans cette boucle, il est seulement nécessaire d'identifier le test et obtenir le droit de tester par exemple.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top