33 votes

Beautiful Soup ne peut pas trouver une classe CSS si l'objet possède également d'autres classes.

Si une page a <div class="class1"> y <p class="class1"> alors soup.findAll(True, 'class1') les trouvera tous les deux.

Si elle a <p class="class1 class2"> En revanche, il ne sera pas trouvé. Comment trouver tous les objets d'une certaine classe, qu'ils aient ou non d'autres classes ?

31voto

endolith Points 4183

Malheureusement, BeautifulSoup traite cette classe comme une classe avec un espace. 'class1 class2' plutôt que deux classes ['class1','class2'] . Une solution de contournement consiste à utiliser une expression régulière pour rechercher la classe au lieu d'une chaîne de caractères.

Ça marche :

soup.findAll(True, {'class': re.compile(r'\bclass1\b')})

13voto

Kugel Points 4595

Juste au cas où quelqu'un rencontrerait cette question. BeautifulSoup prend désormais en charge cette fonction :

Python 2.7.5 (default, May 15 2013, 22:43:36) [MSC v.1500 32 bit (Intel)]
Type "copyright", "credits" or "license" for more information.

In [1]: import bs4

In [2]: soup = bs4.BeautifulSoup('<div class="foo bar"></div>')

In [3]: soup(attrs={'class': 'bar'})
Out[3]: [<div class="foo bar"></div>]

En outre, vous n'avez plus besoin de taper findAll.

9voto

aehlke Points 4180

Vous devez utiliser lxml . Il fonctionne avec plusieurs valeurs de classe séparées par des espaces ('class1 class2').

En dépit de son nom, lxml sert également à analyser le HTML et à en extraire les données. Il est beaucoup, beaucoup plus rapide que BeautifulSoup, et il traite même le HTML "cassé" mieux que BeautifulSoup (son titre de gloire). Il a une API de compatibilité pour BeautifulSoup aussi si vous ne voulez pas apprendre l'API lxml.

Ian Bicking est d'accord et préfère lxml à BeautifulSoup.

Il n'y a plus aucune raison d'utiliser BeautifulSoup, à moins que vous ne soyez sur Google App Engine ou quelque chose d'autre où tout ce qui n'est pas purement Python n'est pas autorisé.

Vous pouvez même utiliser des sélecteurs CSS avec lxml, ce qui le rend beaucoup plus facile à utiliser que BeautifulSoup. Essayez de jouer avec dans une console Python interactive.

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