Güzel Çorba ve div ve içeriğini kimliğine göre ayıklamak


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

Bu neden <div id="articlebody"> ... </div>aradaki etiketleri ve şeyleri döndürmüyor ? Hiçbir şey döndürmez. Ve bunun var olduğu bir gerçeği biliyorum çünkü ona doğru bakıyorum

soup.prettify()

soup.find("div", { "id" : "articlebody" }) ayrıca çalışmıyor.

( DÜZENLEME: BeautifulSoup'un sayfamı doğru bir şekilde ayrıştırmadığını fark ettim, bu muhtemelen ayrıştırmaya çalıştığım sayfanın SGML'de veya başka bir şekilde düzgün biçimlendirilmediği anlamına geliyor)


Yanıtlar:


202

Kod düzgün çalıştığından örnek belgenizi göndermelisiniz:

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

<div>İçinde <div>s bulmak da işe yarıyor:

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

2
benim örnek belgem çok büyük. sorunu takip ediyorum - bu div div üzerinde çalışmadığını düşünüyorum. Ben 10 ile sonuçlanan baskı len (çorba ('div')) ile belgede kaç div olduğunu bir sayı yaptım ve açıkça Firebug ile 10'dan fazla div görebilirsiniz. Bu yüzden sadece div içinde div bulamıyorum düşünüyorum, bu yüzden sarıcı tarafından sarıcı şeyler daraltmak gerekiyor.
Tony Stark

8
O zaman sorunuzu cevaplamak imkansızdır, kristal toplar hata ayıklamanın güvenilir bir yolu değildir. :)
Lukáš Lalinský

1
Bu kodu denedim. div <embed> ve içine gömülü basamıyorum.
Vincent

13
jfs

4
veyasoup.find('div', id='articlebody')
Trevor Boyd Smith

71

Bir öğeyi kendisine göre bulmak için id:

div = soup.find(id="articlebody")

15

Güzel Çorbası 4 destekleri en CSS seçicileri ile .select()yöntemle , bu nedenle bir kullanabilirsiniz idseçici gibi:

soup.select('#articlebody')

Öğenin türünü belirtmeniz gerekiyorsa, seçiciden önce bir tür seçici ekleyebilirsiniz id:

soup.select('div#articlebody')

.select()Bu yöntem aşağıda belirtilen ile aynı sonuçları demektir elemanlarının bir koleksiyonu, döner .find_all()bir yöntem , örneğin:

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

Yalnızca tek bir öğe seçmek istiyorsanız, .find()yöntemi kullanabilirsiniz :

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

13

Ben 'div' etiketleri çok fazla iç içe olduğunda bir sorun olduğunu düşünüyorum. Bir facebook html dosyasından bazı kişileri ayrıştırmaya çalışıyorum ve Beautifulsoup "fcontent" sınıfıyla "div" etiketlerini bulamıyor.

Bu diğer sınıflarda da olur. Genel olarak div aradığımda, sadece çok fazla iç içe olmayanları döndürür.

Html kaynak kodu, bir arkadaşınızın arkadaş listesinin (arkadaşlarınızdan biri değil) facebook'undan herhangi bir sayfa olabilir. Birisi test edip tavsiyelerde bulunabilirse gerçekten minnettar olurum.

Bu benim kod, burada sadece "div" sınıf "fcontent" ile etiket sayısını yazdırmaya çalışın:

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

9

Büyük olasılıkla varsayılan beautifulsoup ayrıştırıcı nedeniyle sorun var. 'Lxml' gibi farklı bir ayrıştırıcıyı değiştirin ve tekrar deneyin.


Bu benim için çalıştı, teşekkürler! Kullandığımsoup = BeautifulSoup(data, parser="html.parser")
irade-Hart

8

Beautifulsoup kaynağında bu çizgi div'lerin div içinde yuvalanmasına izin verir; bu yüzden lukas'ın yorumundaki kaygınız geçerli olmaz.

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

Yapmanız gerektiğini düşündüğüm şey, istediğiniz attrleri belirtmektir.

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

5

denedin soup.findAll("div", {"id": "articlebody"})mi

kulağa çılgınca geliyor, ancak vahşi doğada bir şeyler kazıyorsanız, birden fazla div'ı ekarte edemezsiniz ...


4

Kullandım:

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

Find / findall için sözdizim olarak; Bununla birlikte, etiket ve özellik listesi arasında başka isteğe bağlı parametreler olmadığı sürece, bu farklı olmamalıdır.


4

Google'ı kazımaya çalışırken bana da oldu.
Sonunda pyquery kullanarak.
Yüklemek:

pip install pyquery

kullanın:

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

3

İşte bir kod parçası

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

Gördüğünüz gibi tüm etiketleri buluyorum ve sonra içindeki class = "article" ile tüm etiketleri buluyorum


0

IdÖzelliği her zaman tamamen ayrılır. Bu, öğeyi belirtmeden doğrudan kullanabileceğiniz anlamına gelir. Bu nedenle, öğelerinizin içerikte ayrıştırılması için bir artı noktası vardır.

divEle = soup.find(id = "articlebody")
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.