web-dev-qa-db-fra.com

Belle soupe si la classe "contient" ou Regex?

Si mes noms de classe sont constamment différents, dites par exemple:

listing-col-line-3-11 dpt 41
listing-col-block-1-22 dpt 41
listing-col-line-4-13 CWK 12

Normalement, je pourrais faire:

for EachPart in soup.find_all("div", {"class" : "ClassNamesHere"}):
            print EachPart.get_text()

Il y a beaucoup trop de noms de classe pour travailler avec ici, donc un tas d'entre eux sont sortis.

Je sais Python n'a pas de ".contains" que j'utiliserais normalement mais il a un "in". Bien que je n'ai pas été en mesure de trouver un moyen d'incorporer cela.

J'espère qu'il y a un moyen de le faire avec regex. Bien que ma syntaxe Python me laisse vraiment tomber, j'ai essayé des variations sur:

regex = re.compile('.*listing-col-.*')
    for EachPart in soup.find_all(regex):

Mais cela ne semble pas faire l'affaire.

21
PoweredByCoffee

BeautifulSoup prend en charge sélecteurs CSS qui vous permettent de sélectionner des éléments en fonction du contenu d'attributs particuliers. Cela inclut le sélecteur *= pour contient.

Ce qui suit renverra tous les éléments div avec un attribut class contenant le texte 'listing-col-':

for EachPart in soup.select('div[class*="listing-col-"]'):
    print EachPart.get_text()
27
mfitzp

Yu peut essayer ceci:

regex = re.compile('.*listing-col-.*')
for EachPart in soup.find_all("div", {"class" : regex}):
        print EachPart.get_text()
14
Walid Saad