Mam problem z analizowaniem elementów HTML z atrybutem „class” za pomocą Beautifulsoup. Kod wygląda następująco
soup = BeautifulSoup(sdata)
mydivs = soup.findAll('div')
for div in mydivs:
if (div["class"] == "stylelistrow"):
print div
W tym samym wierszu pojawia się błąd „po” zakończeniu skryptu.
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'
Jak pozbyć się tego błędu?
<.. class="stylelistrow">
pasuje, ale nie<.. class="stylelistrow button">
.class_
który działa poprawnie.Z dokumentacji:
Począwszy od Beautiful Soup 4.1.2, możesz wyszukiwać według klasy CSS za pomocą argumentu słowa kluczowego
class_
:Co w tym przypadku byłoby:
Będzie również działał dla:
źródło
soup.find_all("a", ["stylelistrowone", "stylelistrow"])
jest bezpieczniej, jeśli nie masz wielu klas.soup.findAll("a", {'class':['stylelistrowone', 'stylelistrow']})
.Aktualizacja: 2016 W najnowszej wersji beautifulsoup zmieniono nazwę metody „findAll” na „find_all”. Link do oficjalnej dokumentacji
Stąd odpowiedź będzie
źródło
Specyficzne dla BeautifulSoup 3:
Znajdziesz wszystkie te:
źródło
lambda x: 'stylelistrow' in x.split()
jest prosty i pięknyProstym sposobem byłoby:
Upewnij się, że weźmiesz obudowę findAll , to nie jest findall
źródło
<.. class="stylelistrow">
pasuje, ale nie<.. class="stylelistrow button">
.Możesz łatwo znaleźć według jednej klasy, ale jeśli chcesz znaleźć na przecięciu dwóch klas, jest to trochę trudniejsze,
Z dokumentacji (wyróżnienie dodane):
Dla jasności zaznacza tylko tagi p, które są zarówno przekreślone, jak i klasy ciała.
Aby znaleźć przecięcie dowolnego z zestawu klas (nie przecięcia, ale unii), możesz podać listę
class_
argumentów słów kluczowych (od 4.1.2):Zauważ też, że zmieniono nazwę findAll z camelCase na bardziej Pythonic
find_all
.źródło
Selektory CSS
pierwszy mecz pojedynczej klasy
lista dopasowań
klasa złożona (tj. ORAZ inna klasa)
Spacje w nazwach klas złożonych np.
class = stylelistrow otherclassname
Są zastępowane przez „.”. Możesz kontynuować dodawanie klas.lista klas (LUB - dopasuj dowolną z obecnych
bs4 4.7.1 +
Określona klasa, która
innerText
zawiera ciąg znakówOkreślona klasa, która ma określony element potomny, np.
a
Tagźródło
Począwszy od BeautifulSoup 4+,
Jeśli masz jedną nazwę klasy, możesz po prostu przekazać nazwę klasy jako parametr taki jak:
Lub jeśli masz więcej niż jedną nazwę klasy, po prostu przekaż listę nazw klas jako parametr taki jak:
źródło
Spróbuj najpierw sprawdzić, czy div ma najpierw atrybut klasy, na przykład:
źródło
To działa dla mnie, aby uzyskać dostęp do atrybutu klasy (w beautifulsoup 4, w przeciwieństwie do tego, co mówi dokumentacja). KeyError zawiera zwracaną listę, a nie słownik.
źródło
następujące działało dla mnie
źródło
To działało dla mnie:
źródło
Alternatywnie możemy użyć lxml, obsługuje xpath i bardzo szybko!
źródło
To powinno działać:
źródło
Inne odpowiedzi nie działały dla mnie.
W innych odpowiedziach
findAll
jest on używany na samym obiekcie zupy, ale potrzebowałem sposobu, aby wykonać wyszukiwanie według nazwy klasy na obiektach wewnątrz określonego elementu wydobytego z obiektu, który uzyskałem po wykonaniufindAll
.Jeśli próbujesz przeprowadzić wyszukiwanie w zagnieżdżonych elementach HTML, aby uzyskać obiekty według nazwy klasy, spróbuj poniżej -
Punkty do odnotowania:
Nie definiuję jawnie, że wyszukiwanie ma być oparte na atrybucie „klasa”
findAll("li", {"class": "song_item"})
, ponieważ jest to jedyny atrybut, którego szukam i domyślnie będzie szukał atrybutu klasy, jeśli nie powiesz wyłącznie, który atrybut chcesz znaleźć.Kiedy zrobić
findAll
albofind
, otrzymany przedmiot jest z klasybs4.element.ResultSet
, która jest podklasąlist
. Możesz użyć wszystkich metodResultSet
w dowolnej liczbie elementów zagnieżdżonych (o ile są one typuResultSet
), aby znaleźć lub znaleźć wszystko.Moja wersja BS4 - 4.9.1, wersja Python - 3.8.1
źródło
Następujące powinny działać
zamień „totalcount” na nazwę swojej klasy i „span” na szukany tag. Ponadto, jeśli twoja klasa zawiera wiele nazw ze spacją, po prostu wybierz jedną i użyj.
PS Znajduje pierwszy element z podanymi kryteriami. Jeśli chcesz znaleźć wszystkie elementy, zamień „find” na „find_all”.
źródło