web-dev-qa-db-fra.com

BS4: obtenir du texte dans la balise

J'utilise une belle soupe. Il y a une balise comme celle-ci:

<li><a href="example"> s.r.o., <small>small</small></a></li>

Je veux obtenir le texte dans la balise d'ancrage <a> Uniquement, sans aucune balise <small> Dans la sortie; c'est-à-dire "s.r.o.,"

J'ai essayé find('li').text[0] mais cela ne fonctionne pas.

Y a-t-il une commande dans BS4 qui peut faire cela?

13
Milano

Une option serait d'obtenir le premier élément de contents de l'élément a:

>>> from bs4 import BeautifulSoup
>>> data = '<li><a href="example"> s.r.o., <small>small</small></a></li>'
>>> soup = BeautifulSoup(data)
>>> print soup.find('a').contents[0]
 s.r.o., 

Un autre serait de trouver la balise small et d'obtenir le frère précédent :

>>> print soup.find('small').previous_sibling
 s.r.o., 

Eh bien, il existe également toutes sortes d'options alternatives/folles:

>>> print next(soup.find('a').descendants)
 s.r.o., 
>>> print next(iter(soup.find('a')))
 s.r.o., 
19
alecxe

Utilisez . Enfants

soup.find('a').children.next()
s.r.o.,
3
Padraic Cunningham

Si vous souhaitez faire une boucle pour imprimer tout le contenu des balises d'ancrage situées dans la chaîne/page Web html (doit utiliser urlopen à partir de urllib), cela fonctionne:

from bs4 import BeautifulSoup
data = '<li><a href="example">s.r.o., <small>small</small</a></li> <li><a href="example">2nd</a></li> <li><a href="example">3rd</a></li>'
soup = BeautifulSoup(data,'html.parser')
a_tag=soup('a')
for tag in a_tag:
    print(tag.contents[0])     #.contents method to locate text within <a> tags

Production:

s.r.o.,  
2nd
3rd

a_tag est une liste contenant toutes les balises d'ancrage; la collecte de toutes les balises d'ancrage dans une liste, permet la modification de groupe (si plusieurs <a> balises présentes.

>>>print(a_tag)
[<a href="example">s.r.o.,  <small>small</small></a>, <a href="example">2nd</a>, <a href="example">3rd</a>]
0
Sumanth Lazarus