J'ai du mal à analyser les é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?
<.. class="stylelistrow">
correspond mais pas<.. class="stylelistrow button">
.class_
ce qui fonctionne correctement.De la documentation:
Depuis Beautiful Soup 4.1.2, vous pouvez rechercher par classe CSS en utilisant l'argument mot-clé
class_
:Ce qui dans ce cas serait:
Cela fonctionnerait également pour:
la source
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ée en 'find_all'. Lien vers la documentation officielle
La réponse sera donc
la source
Spécifique à BeautifulSoup 3:
Trouvera tous ces éléments:
la source
lambda x: 'stylelistrow' in x.split()
est simple et beauUne façon simple serait:
Assurez-vous de prendre le boîtier de findAll , ce n'est pas findall
la source
<.. class="stylelistrow">
correspond mais pas<.. class="stylelistrow button">
.Vous pouvez facilement trouver par une classe, mais si vous voulez trouver par l'intersection de deux classes, c'est un peu plus difficile,
D'après la documentation (emphase ajoutée):
Pour être clair, cela ne sélectionne que les balises p qui sont à la fois barrées et classe de corps.
Pour rechercher l'intersection de tout dans un ensemble de classes (pas l'intersection, mais l'union), vous pouvez donner une liste à l'
class_
argument mot - clé (à partir de 4.1.2):Notez également que findAll a été renommé de camelCase en plus Pythonic
find_all
.la source
Sélecteurs CSS
premier match en classe unique
liste des correspondances
classe composée (c.-à-d. ET une autre classe)
Les espaces dans les noms de classe composés, par exemple,
class = stylelistrow otherclassname
sont remplacés par ".". Vous pouvez continuer à ajouter des classes.liste des classes (OU - correspond à celle qui est présente
bs4 4.7.1 +
Classe spécifique dont
innerText
contient une chaîneClasse spécifique qui a un certain élément enfant, par exemple une
a
balisela source
Depuis BeautifulSoup 4+,
Si vous avez un seul nom de classe, vous pouvez simplement passer le nom de classe en paramètre comme:
Ou si vous avez plusieurs noms de classe, passez simplement la liste des noms de classe en paramètre comme:
la source
Essayez de vérifier si le div a un attribut de classe en premier, comme ceci:
la source
Cela fonctionne pour moi d'accéder à l'attribut class (sur beautifulsoup 4, contrairement à ce que dit la documentation). Le KeyError vient une liste renvoyée pas un dictionnaire.
la source
ce qui suit a fonctionné pour moi
la source
Cela a fonctionné pour moi:
la source
Alternativement, nous pouvons utiliser lxml, il prend en charge xpath et très rapidement!
la source
Cela devrait fonctionner:
la source
D'autres réponses n'ont pas fonctionné pour moi.
Dans d'autres réponses, le
findAll
est utilisé sur l'objet soupe lui-même, mais j'avais besoin d'un moyen de faire une recherche par nom de classe sur des objets à l'intérieur d'un élément spécifique extrait de l'objet que j'ai obtenu après avoir faitfindAll
.Si vous essayez de faire une recherche dans des éléments HTML imbriqués pour obtenir des objets par nom de classe, essayez ci-dessous -
Points à noter:
Je ne définis pas explicitement la recherche sur l'attribut 'class'
findAll("li", {"class": "song_item"})
, car c'est le seul attribut sur lequel je recherche et il recherchera par défaut l'attribut class si vous ne dites pas exclusivement sur quel attribut vous voulez trouver.Lorsque vous effectuez un
findAll
oufind
, l'objet résultant est de classebs4.element.ResultSet
qui est une sous-classe delist
. Vous pouvez utiliser toutes les méthodes deResultSet
, à l'intérieur de n'importe quel nombre d'éléments imbriqués (tant qu'ils sont de typeResultSet
) pour effectuer une recherche ou trouver tout.Ma version BS4 - 4.9.1, version Python - 3.8.1
la source
Les éléments suivants devraient fonctionner
remplacez «totalcount» par le nom de votre classe et «span» par la balise que vous recherchez. De plus, si votre classe contient plusieurs noms avec espace, choisissez-en un et utilisez-le.
PS Ceci trouve le premier élément avec des critères donnés. Si vous voulez trouver tous les éléments, remplacez 'find' par 'find_all'.
la source