Comment trouver des éléments par classe
Je vais avoir de la difficulté à l'analyse des éléments HTML avec l'attribut "class" à l'aide de Beautifulsoup. Le code ressemble à ceci
soup = BeautifulSoup(sdata)
mydivs = soup.findAll('div')
for div in mydivs:
if (div["class"] == "stylelistrow"):
print div
J'obtiens une erreur sur la même ligne "après" la fin du script.
File "./beautifulcoding.py", line 130, in getlanguage
if (div["class"] == "stylelistrow"):
File "/usr/local/lib/python2.6/dist-packages/BeautifulSoup.py", line 599, in __getitem__
return self._getAttrMap()[key]
KeyError: 'class'
Comment puis-je me débarrasser de cette erreur?
Vous devez vous connecter pour publier un commentaire.
Vous pourrez affiner votre recherche pour trouver seulement ceux divs avec une classe donnée à l'aide de BS3:
<.. class="stylelistrow">
les matchs, mais pas<.. class="stylelistrow button">
.class_
qui fonctionne correctement.soup.select("p.stylelistrow.another")
qui correspondent à<p class="stylelistrow another yetAnother">
par exempleÀ partir de la documentation:
Que de Belles Soupe 4.1.2, vous pouvez effectuer une recherche par classe CSS à l'aide de l'argument mot-clé
class_
:Qui dans ce cas serait:
Il serait également travailler pour:
soup.find_all("a", ["stylelistrowone", "stylelistrow"])
C'est plus sûr si vous n'avez pas beaucoup de classes.soup.findAll("a", {'class':['stylelistrowone', 'stylelistrow']})
.Mise à jour: 2016
Dans la dernière version de beautifulsoup, la méthode findAll " a été renommé
'find_all'. Lien vers la documentation officielle
Donc la réponse sera
Un simple serait :
Assurez-vous de prendre de l'enveloppe de findAll, ce n'est pas findall
<.. class="stylelistrow">
les matchs, mais pas<.. class="stylelistrow button">
.Spécifiques à BeautifulSoup 3:
Trouverez tous ces:
lambda x: 'stylelistrow' in x.split()
est simple et beauVous pouvez facilement trouver par une classe, mais si vous voulez trouver par l'intersection de deux classes, c'est un peu plus difficile,
De la la documentation (italiques ajoutés):
Pour être clair, ce ne sélectionne que les balises p qui sont à la fois barré et le corps de la classe.
De trouver à l'intersection de tout dans un ensemble de classes (pas de l'intersection, mais l'union), vous pouvez donner une liste à la
class_
argument mot-clé (comme d'4.1.2):Également noter que findAll a été renommé de la camelCase pour le plus Pythonic
find_all
.Essayez de vérifier si la div a un attribut de classe de première, comme ceci:
Cela fonctionne pour moi d'accéder à l'attribut de classe (sur beautifulsoup 4, contrairement à ce que dit la documentation). Le KeyError vient une liste retourné pas un dictionnaire.
Sélecteurs CSS
seule classe premier match
la liste des matchs
composé de la classe (c'est à dire ET une autre classe)
Espaces composé des noms de classe par exemple
class = stylelistrow otherclassname
sont remplacés par ".". Vous pouvez continuer à ajouter des classes.liste des classes (OU match selon la présente
Cela a fonctionné pour moi:
Cela devrait fonctionner:
De BeautifulSoup 4+ ,
Si vous avez un seul nom de la classe , vous pouvez simplement transmettre le nom de la classe en paramètre comme :
Ou si vous avez plusieurs noms de classe , il suffit de passer la liste des noms de classe en paramètre comme :