Beautiful Soup dan mengekstraksi div dan isinya dengan ID

147
soup.find("tagName", { "id" : "articlebody" })

Mengapa ini TIDAK mengembalikan <div id="articlebody"> ... </div>tag dan barang-barang di antaranya? Tidak mengembalikan apa pun. Dan aku tahu pasti itu ada karena aku menatap langsung darinya

soup.prettify()

soup.find("div", { "id" : "articlebody" }) juga tidak berfungsi.

( EDIT: Saya menemukan bahwa BeautifulSoup tidak benar mem-parsing halaman saya, yang mungkin berarti halaman yang saya coba parsing tidak diformat dengan benar dalam SGML atau apa pun)

Tony Stark
sumber
(Untuk EDIT Anda, pertanyaan ini masih memiliki nilai sebagai sumber daya yang dapat digunakan kembali oleh orang lain, bahkan jika parser tidak berfungsi di laman khusus Anda)
smci

Jawaban:

202

Anda harus memposting contoh dokumen Anda, karena kode berfungsi dengan baik:

>>> import BeautifulSoup
>>> soup = BeautifulSoup.BeautifulSoup('<html><body><div id="articlebody"> ... </div></body></html')
>>> soup.find("div", {"id": "articlebody"})
<div id="articlebody"> ... </div>

Menemukan karya s <div>di dalam <div>juga:

>>> soup = BeautifulSoup.BeautifulSoup('<html><body><div><div id="articlebody"> ... </div></div></body></html')
>>> soup.find("div", {"id": "articlebody"})
<div id="articlebody"> ... </div>
Lukáš Lalinský
sumber
2
contoh dokumen saya sangat besar. Saya melacak masalahnya - saya pikir ini tidak bekerja pada divs divs. Saya menghitung berapa banyak div yang ada dalam dokumen dengan print len ​​(soup ('div')) yang menghasilkan 10, dan saya dapat dengan jelas melihat lebih dari 10 div dengan pembakar. jadi saya pikir itu hanya tidak dapat menemukan divs di dalam divs, jadi saya perlu mempersempit bungkus dengan bungkus.
Tony Stark
8
Nah, maka tidak mungkin untuk menjawab pertanyaan Anda, bola kristal bukan cara debugging yang dapat diandalkan. :)
Lukáš Lalinský
1
Saya mencoba kode ini. div telah <embed> dan saya tidak bisa mencetak embed di dalamnya.
Vincent
13
atau lebih tepatnyadiv = soup.find(id="articlebody")
jfs
4
atausoup.find('div', id='articlebody')
Trevor Boyd Smith
71

Untuk menemukan elemen dengan id:

div = soup.find(id="articlebody")
jfs
sumber
15

Beautiful Soup 4 mendukung sebagian besar penyeleksi CSS dengan .select()metode ini , oleh karena itu Anda dapat menggunakan idpemilih seperti:

soup.select('#articlebody')

Jika Anda perlu menentukan jenis elemen, Anda bisa menambahkan pemilih jenis sebelum idpemilih:

soup.select('div#articlebody')

The .select()Metode akan kembali kumpulan elemen, yang berarti bahwa itu akan mengembalikan hasil yang sama seperti berikut .find_all()metode contoh:

soup.find_all('div', id="articlebody")
# or
soup.find_all(id="articlebody")

Jika Anda hanya ingin memilih satu elemen, maka Anda bisa menggunakan .find()metode ini :

soup.find('div', id="articlebody")
# or
soup.find(id="articlebody")
Josh Crozier
sumber
13

Saya pikir ada masalah ketika tag 'div' terlalu banyak bersarang. Saya mencoba menguraikan beberapa kontak dari file html facebook, dan Beautifulsoup tidak dapat menemukan tag "div" dengan kelas "fcontent".

Ini terjadi dengan kelas-kelas lain juga. Ketika saya mencari div secara umum, ternyata hanya yang tidak begitu banyak bersarang.

Kode sumber html dapat berupa halaman mana saja dari facebook dari daftar teman dari teman Anda (bukan salah satu dari teman Anda). Jika seseorang dapat mengujinya dan memberikan beberapa saran saya akan sangat menghargainya.

Ini adalah kode saya, di mana saya hanya mencoba untuk mencetak jumlah tag "div" dengan kelas "fcontent":

from BeautifulSoup import BeautifulSoup 
f = open('/Users/myUserName/Desktop/contacts.html')
soup = BeautifulSoup(f) 
list = soup.findAll('div', attrs={'class':'fcontent'})
print len(list)
omar
sumber
9

Kemungkinan besar karena parser beautifulsoup default memiliki masalah. Ubah parser yang berbeda, seperti 'lxml' dan coba lagi.

liang
sumber
Ini berhasil untuk saya, terima kasih! Saya menggunakansoup = BeautifulSoup(data, parser="html.parser")
will-hart
8

Dalam sumber beautifulsoup, baris ini memungkinkan div untuk bersarang di dalam div; jadi kekhawatiran Anda dalam komentar lukas tidak akan valid.

NESTABLE_BLOCK_TAGS = ['blockquote', 'div', 'fieldset', 'ins', 'del']

Apa yang saya pikir perlu Anda lakukan adalah menentukan attrs yang Anda inginkan seperti

source.find('div', attrs={'id':'articlebody'})
dagoof
sumber
5

Anda mencoba soup.findAll("div", {"id": "articlebody"})?

kedengarannya gila, tetapi jika Anda mengais barang-barang dari alam, Anda tidak dapat mengesampingkan beberapa div ...

pengguna106514
sumber
4

Saya menggunakan:

soup.findAll('tag', attrs={'attrname':"attrvalue"})

Sebagai sintaks saya untuk find / findall; yang mengatakan, kecuali ada parameter opsional lain antara tag dan daftar atribut, ini seharusnya tidak berbeda.


sumber
4

Terjadi pada saya juga ketika mencoba untuk mengikis Google.
Saya akhirnya menggunakan pyquery.
Install:

pip install pyquery

Menggunakan:

from pyquery import PyQuery    
pq = PyQuery('<html><body><div id="articlebody"> ... </div></body></html')
tag = pq('div#articlebody')
Shoham
sumber
3

Ini adalah fragmen kode

soup = BeautifulSoup(:"index.html")
titleList = soup.findAll('title')
divList = soup.findAll('div', attrs={ "class" : "article story"})

Seperti yang Anda lihat saya menemukan semua tag dan kemudian saya menemukan semua tag dengan class = "article" di dalamnya

Pengulangan
sumber
0

The Idproperti selalu unik diidentifikasi. Itu berarti Anda dapat menggunakannya secara langsung tanpa menentukan elemen. Oleh karena itu, ini merupakan poin plus jika elemen Anda memilikinya untuk mem-parsing melalui konten.

divEle = soup.find(id = "articlebody")
Iqra.
sumber