5 votes

Comment utiliser Beautiful Soup pour trouver une balise avec un ID changeant ?

Je suis en train d'utiliser Beautiful Soup en Python.

Voici un exemple d'URL :

http://www.locationary.com/place/en/US/Ohio/Middletown/McDonald%27s-p1013254580.jsp

Dans le HTML, il y a toute une série de balises et la seule façon que j'ai de spécifier celles à trouver est avec leur id. La seule chose que je veux trouver est le numéro de téléphone. La balise ressemble à ceci :

5134231582 

Je suis allé sur d'autres URL sur le même site web et j'ai trouvé presque le même id pour la balise du numéro de téléphone à chaque fois. La partie qui reste toujours la même est :

'value_xxx_c_1_f_8_a_'

Cependant, les chiffres qui suivent cela changent toujours. Y a-t-il un moyen de dire à Beautiful Soup de chercher une partie de l'id et de la faire correspondre tout en laissant l'autre partie être des chiffres comme le ferait une expression régulière?

Aussi, une fois que j'ai la balise, je me demandais... comment puis-je extraire le numéro de téléphone sans utiliser d'expressions régulières? Je ne sais pas si Beautiful Soup peut le faire mais ce serait probablement plus simple que les regex.

4voto

Simeon Visser Points 30697

Vous pouvez utiliser des expressions régulières (cet exemple correspond aux noms des balises, vous devez l'ajuster pour qu'il corresponde à l'identifiant d'un élément) :

import re
for tag in soup.find_all(re.compile("^value_xxx_c_1_f_8_a_")):
    print(tag.name)

2voto

Andreas Jung Points 1

Connaître votre documentation

http://www.crummy.com/software/BeautifulSoup/bs3/documentation.html

soup.findAll(id=re.compile("para$"))
# [Ceci est le paragraphe un.,
#  Ceci est le paragraphe deux.]

1voto

Martijn Pieters Points 271458

Vous pouvez utiliser Sélecteurs CSS ici, pour faire correspondre un préfixe de valeur d'attribut :

soup.select('div[id^="value_xxx_c_1_f_8_a_"]')

Cela ne correspondra qu'aux balises

avec un attribut id qui commence par la chaîne value_xxx_c_1_f_8_a_.

Si vous êtes prêt à passer à lxml à la place, vous pouvez utiliser une expression XPath 1.0 pour trouver ceux-ci :

from lxml import etree
doc = etree.parse(openfile)
for elem in doc.xpath('//div[starts-with(@id, "value_xxx_c_1_f_8_a_")]'):
    print elem.text

Utiliser une expression XPath lxml sera un ordre de grandeur plus rapide que d'utiliser une correspondance d'expression régulière BeautifulSoup.

0voto

user1593755 Points 31

Pour obtenir le numéro de téléphone, vous pouvez utiliser l'attribut .text.

tag = soup.find("foo")
numéro_de_téléphone = tag.text

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X