Saya mengalami masalah dalam menguraikan elemen HTML dengan atribut "class" menggunakan Beautifulsoup. Kode terlihat seperti ini
soup = BeautifulSoup(sdata)
mydivs = soup.findAll('div')
for div in mydivs:
if (div["class"] == "stylelistrow"):
print div
Saya mendapatkan kesalahan pada baris yang sama "setelah" skrip selesai.
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'
Bagaimana saya menyingkirkan kesalahan ini?
<.. class="stylelistrow">
cocok tapi tidak<.. class="stylelistrow button">
.class_
yang berfungsi dengan baik.Dari dokumentasi:
Pada Beautiful Soup 4.1.2, Anda dapat mencari berdasarkan kelas CSS menggunakan argumen kata kunci
class_
:Yang dalam hal ini adalah:
Ini juga akan bekerja untuk:
sumber
soup.find_all("a", ["stylelistrowone", "stylelistrow"])
Lebih aman jika Anda tidak memiliki banyak kelas.soup.findAll("a", {'class':['stylelistrowone', 'stylelistrow']})
.Pembaruan: 2016 Dalam versi terbaru beautifulsoup, metode 'findAll' telah diubah namanya menjadi 'find_all'. Tautan ke dokumentasi resmi
Maka jawabannya adalah
sumber
Khusus untuk BeautifulSoup 3:
Akan menemukan semua ini:
sumber
lambda x: 'stylelistrow' in x.split()
sederhana dan indahJalan lurus ke depan adalah:
Pastikan Anda mengambil casing findAll , bukan findall
sumber
<.. class="stylelistrow">
cocok tapi tidak<.. class="stylelistrow button">
.Anda dapat dengan mudah menemukan dengan satu kelas, tetapi jika Anda ingin menemukan dengan persimpangan dua kelas, itu sedikit lebih sulit,
Dari dokumentasi (penekanan ditambahkan):
Agar lebih jelas, ini hanya memilih tag p yang keduanya strikeout dan kelas tubuh.
Untuk menemukan persimpangan dari setiap kelas (bukan persimpangan, tetapi gabungan), Anda dapat memberikan daftar ke
class_
argumen kata kunci (pada 4.1.2):Perhatikan juga bahwa findAll telah diubah namanya dari camelCase menjadi lebih Pythonic
find_all
.sumber
Penyeleksi CSS
pertandingan pertama kelas tunggal
daftar kecocokan
kelas majemuk (yaitu DAN kelas lain)
Spasi dalam nama kelas majemuk misalnya
class = stylelistrow otherclassname
diganti dengan "." Anda dapat terus menambahkan kelas.daftar kelas (ATAU - cocokkan yang mana saja yang hadir
bs4 4.7.1 +
Kelas khusus yang
innerText
berisi stringKelas khusus yang memiliki elemen turunan tertentu misalnya
a
tagsumber
Pada BeautifulSoup 4+,
Jika Anda memiliki nama kelas tunggal, Anda bisa meneruskan nama kelas sebagai parameter seperti:
Atau jika Anda memiliki lebih dari satu nama kelas, cukup berikan daftar nama kelas sebagai parameter seperti:
sumber
Coba periksa apakah div memiliki atribut class terlebih dahulu, seperti ini:
sumber
Ini berfungsi bagi saya untuk mengakses atribut kelas (pada beautifulsoup 4, bertentangan dengan apa yang dikatakan dokumentasi). KeyError datang daftar yang dikembalikan bukan kamus.
sumber
berikut ini bekerja untuk saya
sumber
Ini bekerja untuk saya:
sumber
Atau kita dapat menggunakan lxml, mendukung xpath dan sangat cepat!
sumber
Ini seharusnya bekerja:
sumber
Jawaban lain tidak berhasil untuk saya.
Dalam jawaban lain,
findAll
ini digunakan pada objek sup itu sendiri, tetapi saya membutuhkan cara untuk melakukan pencarian berdasarkan nama kelas pada objek di dalam elemen tertentu yang diekstraksi dari objek yang saya peroleh setelah melakukanfindAll
.Jika Anda mencoba melakukan pencarian di dalam elemen HTML bersarang untuk mendapatkan objek dengan nama kelas, coba di bawah ini -
Poin yang perlu diperhatikan:
Saya tidak secara eksplisit mendefinisikan pencarian menjadi atribut 'kelas'
findAll("li", {"class": "song_item"})
, karena itu adalah satu-satunya atribut yang saya cari dan itu akan secara default mencari atribut kelas jika Anda tidak secara eksklusif memberi tahu atribut yang ingin Anda temukan.Ketika Anda melakukan
findAll
ataufind
, objek yang dihasilkan adalah kelasbs4.element.ResultSet
yang merupakan subkelas darilist
. Anda dapat menggunakan semua metodeResultSet
di dalam sejumlah elemen bersarang (asalkan bertipeResultSet
) untuk menemukan atau menemukan semuanya.Versi BS4 saya - 4.9.1, Versi Python - 3.8.1
sumber
Berikut ini harus bekerja
ganti 'totalcount' dengan nama kelas Anda dan 'span' dengan tag yang Anda cari. Juga, jika kelas Anda berisi banyak nama dengan spasi, cukup pilih satu dan gunakan.
PS Ini menemukan elemen pertama dengan kriteria yang diberikan. Jika Anda ingin menemukan semua elemen, ganti 'temukan' dengan 'find_all'.
sumber