2010-12-11 4 views
5

Je suis nouveau à Python et à la belle soupe également! J'ai entendu parler de BS. Il est dit d'être un excellent outil pour analyser et extraire le contenu. Donc ici je suis ...:Belle soupe [Python] et l'extraction de texte dans un tableau

Je veux prendre le contenu de la première td d'une table dans un document html . Par exemple, j'ai ce tableau

<table class="bp_ergebnis_tab_info"> 
    <tr> 
      <td> 
        This is a sample text 
      </td> 

      <td> 
        This is the second sample text 
      </td> 
    </tr> 
</table> 

Comment puis-je utiliser beautifulsoup prendre le texte « Ceci est un exemple de texte »? J'utilise soup.findAll ('table', attrs = {'class': 'bp_ergebnis_tab_info'}) pour obtenir la table entière. Merci ... ou devrais-je essayer d'obtenir tout ça avec Perl ... que je ne connais pas si bien. Une autre solution serait une regex en PHP.

Voir la cible [1]: http://www.schulministerium.nrw.de/BP/SchuleSuchen?action=799.601437941842&SchulAdresseMapDO=142323

Remarque; puisque le html est un peu invalide - je pense que nous devons faire un peu de nettoyage. Cela peut causer beaucoup de code PHP - puisque nous voulons résoudre le problème en PHP. Perl serait une bonne solution aussi.

Un grand merci pour quelques conseils et idées pour un point de départ zéro

+1

Eh bien, de toute évidence, vous n'avez pas réussi à tirer le meilleur parti de vos questions Perl, donc je ne sais même pas pourquoi cette question est taguée avec Perl. De même, ne créez pas de nouveaux comptes toutes les quelques semaines: créez-en un et respectez-le. @zero sait de quoi je parle. D'autres peuvent jeter un oeil à http: // stackoverflow.com/users/477580/thebutcher et http://stackoverflow.com/q/3991571/100754 et des questions liées à partir de là. –

Répondre

12

d'abord trouver la table (comme vous êtes Faire). En utilisant find plutôt que findall renvoie le premier élément dans la liste (au lieu de retourner une liste de toutes les découvertes - dans ce cas, nous aurions dû ajouter un [0] supplémentaire pour prendre le premier élément de la liste):

table = soup.find('table' ,attrs={'class':'bp_ergebnis_tab_info'}) 

utilisez ensuite find à nouveau pour trouver la première td:

first_td = table.find('td') 

utilisez ensuite renderContents() pour extraire le contenu textuel:

text = first_td.renderContents() 

... et le travail est fait (bien que vous pouvez également utiliser strip() pour supprimer les espaces avant et arrière:

trimmed_text = text.strip() 

Cela devrait donner:

>>> print trimmed_text 
This is a sample text 
>>> 

comme vous le souhaitez.

+0

Bonjour psmears, beaucoup de mercis pour la réponse. Tu m'encourage à utiliser Belle soupe! Vos indices étaient très très clairs et concis. Merci beaucoup pour cet excellent atout de "Learing-a-new-technique". Je suis content. Salutations Zero – zero

+0

Pouvez-vous rechercher avec 'find()' pour le contenu textuel au lieu de 'text ='? – User

-1

je trouve Beautiful Soup outil très efficace alors gardez l'apprentissage :-) Il est capable d'analyser une page avec un balisage non valide, il devrait pouvoir pour gérer la page que vous référez. Vous pouvez utiliser la commande BeautifulSoup(html).prettify() si vous souhaitez obtenir une source de page reformatée valide avec un balisage valide.

Quant à votre question, le résultat de votre première commande soup.findAll(...) est également un bel objet de soupe et vous pouvez faire une seconde recherche dans, comme ceci:

table_soup = soup.findAll('table' ,attrs={'class':'bp_ergebnis_tab_info'}) 
your_sample_text = table_soup.find("td").renderContents().strip() 

print your_sample_text 
+0

Bonjour Martin - merci beaucoup pour les bons conseils. Je suis très content de votre publication: Vous m'encouragez à apprendre Beautiful Soup! Je ferai! Comme pour le code. Je vais appliquer le code à l'URL cible ci-dessus. Je reviens et rapporte toutes mes conclusions. Encore une fois, merci beaucoup pour votre aide! C'est un excellent outil d'apprentissage pour moi! Salutations à vous (et à toute la communauté) – zero