2012-07-04 17 views
9

Güzel Çorba modülünü kullanarak, sınıf adı feeditemcontent cxfeeditemcontent olan div etiketinin verilerini nasıl edinebilirim? HTML kaynakGüzel Çorba Kullanarak sınıf adı ve içeriği alın

soup.find_all('class') 

Bu edilir:

soup.class['feeditemcontent cxfeeditemcontent'] 

ya: Öyle mi

<div class="feeditemcontent cxfeeditemcontent"> 
    <div class="feeditembodyandfooter"> 
     <div class="feeditembody"> 
     <span>The actual data is some where here</span> 
     </div> 
    </div> 
</div> 

ve bu Python kodu:

from BeautifulSoup import BeautifulSoup 
html_doc = open('home.jsp.html', 'r') 

soup = BeautifulSoup(html_doc) 
class="feeditemcontent cxfeeditemcontent" 

cevap

8

belki bu basit bir şey için çok fazla, bu deneyin ama işe yarıyor:

def match_class(target): 
    target = target.split() 
    def do_match(tag): 
     try: 
      classes = dict(tag.attrs)["class"] 
     except KeyError: 
      classes = "" 
     classes = classes.split() 
     return all(c in classes for c in target) 
    return do_match 

html = """<div class="feeditemcontent cxfeeditemcontent"> 
<div class="feeditembodyandfooter"> 
<div class="feeditembody"> 
<span>The actual data is some where here</span> 
</div> 
</div> 
</div>""" 

from BeautifulSoup import BeautifulSoup 

soup = BeautifulSoup(html) 

matches = soup.findAll(match_class("feeditemcontent cxfeeditemcontent")) 
for m in matches: 
    print m 
    print "-"*10 

matches = soup.findAll(match_class("feeditembody")) 
for m in matches: 
    print m 
    print "-"*10 
+4

'classes = dict (tag.attrs) .get ('class', '')' 'try'' except' bloğundan çok daha kısadır ve işlevselliği aynıdır. –

+0

@DoronCohen 'dict()' gerekli mi? Olmadan çalışmak görünüyor. – Mark

+0

@Mark "dict()" olmadan bir istisna alıyorum çünkü bu bir 'TypeError listesidir: liste indisleri str değil, tamsayı olmalıdır. Ayrıca, bu cevap Güzel Çorba 3'ü (neden farklı sonuçlar gördüğünüz olabilir) olduğunu varsayarsa, muhtemelen 4 numaralı sürümü kullanmalı ve diğer cevabı kullanmalısınız. – jadkik94

1
soup.find("div", {"class" : "feeditemcontent cxfeeditemcontent"}) 
+0

veya soup.findBirden daha fazlasını istiyorsanız (aynı argümanları kullanın) –

+0

Bu kodu gerçekten açık nedenlerle kullanamazdım. Cevabımı kontrol et. İlgili bir hata raporu var. – SuperSaiyan

+0

Çözümümüzü neden düşürdüğünüzü açıklayabilir misiniz? Kusursuz çalışıyor. –

0
.210 Kontrol Bu hata raporu: Gördüğünüz gibi https://bugs.launchpad.net/beautifulsoup/+bug/410304

, Güzel çorba gerçekten class="a b" iki sıra sınıfları a ve b anlayamıyorum. Bununla birlikte, ilk yorumda göründüğü gibi, basit bir regexp yeterli olmalıdır. Sizin durumunuzda:

soup = BeautifulSoup(html_doc) 
for x in soup.findAll("div",{"class":re.compile(r"\bfeeditemcontent\b")}): 
    print "result: ",x 

Not: Bu son betada düzeltilmiştir. Son sürümlerin dokümanlarını incelemedim, belki bunu yapabilirdiniz. Veya eski sürümü kullanarak çalışmak istiyorsanız, yukarıdakileri kullanabilirsiniz.

17

Güzel çorba 4 davranır bir liste yerine bir dize olarak "Sınıf" özelliğinin değeri, can jadkik94 en çözümünü anlam basitleştirilecek:

from bs4 import BeautifulSoup             

def match_class(target):               
    def do_match(tag):               
     classes = tag.get('class', [])           
     return all(c in classes for c in target)         
    return do_match                

soup = BeautifulSoup(html)              
print soup.find_all(match_class(["feeditemcontent", "cxfeeditemcontent"])) 
3
from BeautifulSoup import BeautifulSoup 
f = open('a.htm') 
soup = BeautifulSoup(f) 
list = soup.findAll('div', attrs={'id':'abc def'}) 
print list 
4

soup.findAll("div", class_="feeditemcontent cxfeeditemcontent")

Yani, ge istiyorsanız Bu BS4 documentation zaten

from bs4 import BeautifulSoup as bs 
import requests 

url = "http://stackoverflow.com/" 
html = requests.get(url).text 
soup = bs(html) 

tags = soup.findAll("div", class_="header") 

: bir şey gibi t stackoverflow.com Sınıf başlığının <div class="header"> tüm div etiketleri, BeautifulSoup ile bir örnek olacaktır.

İlgili konular