web-dev-qa-db-fra.com

Comment trouver tous les divs dont la classe commence par une chaîne dans BeautifulSoup?

Dans BeautifulSoup, si je veux trouver tous les div dont la classe est span3, je ferais juste:

result = soup.findAll("div",{"class":"span3"})

Cependant, dans mon cas, je veux trouver tous les div dont la classe commence par span3, par conséquent, BeautifulSoup devrait trouver:

<div id="span3 span49">
<div id="span3 span39">

Etc...

Comment réaliser ce que je veux? Je connais les expressions régulières; cependant, je ne sais pas comment les implémenter dans une belle soupe et je n'ai trouvé aucune aide en parcourant la documentation de BeautifulSoup.

16
George Chalhoub

Eh bien, ce sont les attributs id que vous affichez:

<div id="span3 span49">
<div id="span3 span39">

Dans ce cas, vous pouvez utiliser:

soup.find_all("div", id=lambda value: value and value.startswith("span3"))

Ou:

soup.find_all("div", id=re.compile("^span3"))

Si ce n'était qu'une faute de frappe et que vous avez en fait class les attributs commencent par span3, et vous avez vraiment besoin de vérifier la classe pour commencer par span3, vous pouvez utiliser le "commence par" sélecteur CSS :

soup.select("div[class^=span3]")

C'est parce que vous ne pouvez pas vérifier l'attribut class de la même manière que vous avez vérifié l'attribut id parce que class est spécial, c'est un attribut à valeurs multiples =.

20
alecxe

Cela fonctionne aussi:

soup.select("div[class*=span3]") # with *= means: contains
7
oscarAguayo