Ich habe Probleme beim Analysieren von HTML-Elementen mit dem Attribut "class" mithilfe von Beautifulsoup. Der Code sieht so aus
soup = BeautifulSoup(sdata)
mydivs = soup.findAll('div')
for div in mydivs:
if (div["class"] == "stylelistrow"):
print div
Ich erhalte eine Fehlermeldung in derselben Zeile "nachdem" das Skript beendet wurde.
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'
Wie werde ich diesen Fehler beseitigen?
<.. class="stylelistrow">
passt aber nicht<.. class="stylelistrow button">
.class_
was richtig funktioniert.Aus der Dokumentation:
Ab Beautiful Soup 4.1.2 können Sie mit dem Schlüsselwortargument nach CSS-Klasse suchen
class_
:Was in diesem Fall wäre:
Es würde auch funktionieren für:
quelle
soup.find_all("a", ["stylelistrowone", "stylelistrow"])
Es ist sicherer, wenn Sie nicht viele Klassen haben.soup.findAll("a", {'class':['stylelistrowone', 'stylelistrow']})
.Update: 2016 In der neuesten Version von beautifulsoup wurde die Methode 'findAll' in 'find_all' umbenannt. Link zur offiziellen Dokumentation
Daher wird die Antwort sein
quelle
Speziell für BeautifulSoup 3:
Finden Sie alle diese:
quelle
lambda x: 'stylelistrow' in x.split()
ist einfach und schönEin direkter Weg wäre:
Stellen Sie sicher, dass Sie das Gehäuse von findAll abnehmen , es ist nicht findall
quelle
<.. class="stylelistrow">
passt aber nicht<.. class="stylelistrow button">
.Sie können leicht nach einer Klasse finden, aber wenn Sie nach dem Schnittpunkt zweier Klassen suchen möchten, ist es etwas schwieriger.
Aus der Dokumentation (Hervorhebung hinzugefügt):
Um klar zu sein, werden hier nur die p-Tags ausgewählt, die sowohl Strikeout als auch Body Class sind.
Um den Schnittpunkt von any in einer Reihe von Klassen zu finden (nicht den Schnittpunkt, sondern die Vereinigung), können Sie dem
class_
Schlüsselwortargument (ab 4.1.2) eine Liste geben :Beachten Sie auch, dass findAll von camelCase in pythonischer umbenannt wurde
find_all
.quelle
CSS-Selektoren
Einzelklasse erstes Match
Liste der Übereinstimmungen
zusammengesetzte Klasse (dh UND eine andere Klasse)
Leerzeichen in zusammengesetzten Klassennamen werden z. B.
class = stylelistrow otherclassname
durch "." Ersetzt. Sie können weiterhin Klassen hinzufügen.Liste der Klassen (ODER - entspricht der vorhandenen Klasse
bs4 4.7.1 +
Bestimmte Klasse,
innerText
die eine Zeichenfolge enthältBestimmte Klasse mit einem bestimmten untergeordneten Element, z. B.
a
Tagquelle
Ab BeautifulSoup 4+,
Wenn Sie einen einzelnen Klassennamen haben, können Sie den Klassennamen einfach wie folgt übergeben:
Oder wenn Sie mehr als einen Klassennamen haben, übergeben Sie einfach die Liste der Klassennamen als Parameter wie:
quelle
Versuchen Sie zuerst zu überprüfen, ob das div ein Klassenattribut hat, wie folgt:
quelle
Dies funktioniert für mich, um auf das Klassenattribut zuzugreifen (auf beautifulsoup 4, entgegen der Dokumentation). Der KeyError enthält eine Liste, die nicht als Wörterbuch zurückgegeben wird.
quelle
Folgendes hat bei mir funktioniert
quelle
Das hat bei mir funktioniert:
quelle
Alternativ können wir lxml verwenden, es unterstützt xpath und ist sehr schnell!
quelle
Das sollte funktionieren:
quelle
Andere Antworten haben bei mir nicht funktioniert.
In anderen Antworten
findAll
wird das für das Suppenobjekt selbst verwendet, aber ich brauchte eine Möglichkeit, Objekte nach Objekten innerhalb eines bestimmten Elements zu finden, die aus dem Objekt extrahiert wurden, das ich nach dem Ausführen erhalten hattefindAll
.Wenn Sie versuchen, in verschachtelten HTML-Elementen nach Objekten nach Klassennamen zu suchen, versuchen Sie es unten -
Zu beachtende Punkte:
Ich definiere die Suche nicht explizit als "Klassen" -Attribut
findAll("li", {"class": "song_item"})
, da dies das einzige Attribut ist, nach dem ich suche, und standardmäßig nach Klassenattributen gesucht wird, wenn Sie nicht ausschließlich angeben, nach welchem Attribut Sie suchen möchten.Wenn Sie ein
findAll
oderfind
ausführen, gehört das resultierende Objekt zur Klasse,bs4.element.ResultSet
die eine Unterklasse von istlist
. Sie können alle MethodenResultSet
innerhalb einer beliebigen Anzahl verschachtelter Elemente (sofern diese vom Typ sindResultSet
) verwenden, um eine Suche durchzuführen oder alle zu finden.Meine BS4-Version - 4.9.1, Python-Version - 3.8.1
quelle
Folgendes sollte funktionieren
Ersetzen Sie 'totalcount' durch Ihren Klassennamen und 'span' durch das gesuchte Tag. Wenn Ihre Klasse mehrere Namen mit Leerzeichen enthält, wählen Sie einfach einen aus und verwenden Sie.
PS Hiermit wird das erste Element mit bestimmten Kriterien gefunden. Wenn Sie alle Elemente finden möchten, ersetzen Sie 'find' durch 'find_all'.
quelle