2010-08-06 11 views
2

J'utilise BS pour gratter une page web et je suis un peu coincé avec un petit problème. Voici un extrait de code HTML de la page.Extraction d'une valeur d'étiquette dans BeautifulSoup lorsque l'on peut faire correspondre par position ou par attributs

<span style="font-family: arial;"><span style="font-weight: bold;">Artist:</span> M.I.A.<br> 
</span> 

Une fois que j'ai la soupe, comment puis-je trouver cette balise et obtenir le nom de l'artiste à savoir M.i.a. Je ne peux pas faire correspondre l'étiquette avec l'attribut style car il est utilisé dans une douzaine d'endroits dans la page. Je ne connais même pas l'emplacement exact du tag span car il change de position de page en page. Par conséquent, je ne peux pas correspondre par position. Le nom de l'artiste change mais la structure de la plage de titres est toujours la même.

Je voudrais seulement l'extrait le nom de l'artiste (le bit M.I.A.).

+0

Donc, vous voulez des choses après une balise avec la valeur de texte de "Artiste:"? Est-ce ce que vous essayez de faire? –

+0

Oui, c'est exactement ce que je veux. Merci. –

Répondre

1

BeautifulSoup est en quelque sorte mort, puisque SGMLParser est déprécié. Je vous suggère d'utiliser la meilleure bibliothèque lxml - Il a même xpath soutien !!

from lxml import html 

text = ''' 
<span style="font-family: arial;"> 
    <span style="font-weight: bold;">Artist:</span>M.I.A.<br> 
</span> 
''' 

doc = html.fromstring(text) 
print ''.join(doc.xpath("//span/span[text()='Artist:']/../text()")) 

Cette expression XPath signifie « trouver la balise span qui se trouve dans une autre balise span et contient le texte 'Artist:' et saisir tout le texte de l'étiquette contenant des parents ». Il imprime correctement M.I.A. comme on pourrait s'y attendre.