2012-07-04 10 views
9

美しいスープモジュールを使用して、feeditemcontent cxfeeditemcontentdivタグのデータを取得するにはどうすればよいですか?それは次のとおりです。美味しいスープを使ってクラス名と内容を取得

soup.class['feeditemcontent cxfeeditemcontent'] 

か:

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

と、これはPythonのコードです:

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

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

答えて

8

多分それはこの単純なことのためにあまりにも多くのですが、それは動作しますが、これを試してみてください:

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

'class = dict(tag.attrs).get( 'class'、 '')'は 'try'' except'ブロックよりもずっと短く、機能は同じです。 –

+0

@DoronCohenは 'dict()'が必要ですか?せずに働くと思われる。 – Mark

+0

@マークこれは 'TypeError:list indicesはstrではなく、整数でなければならないリストなので、' dict() 'なしで例外が発生します。また、この答えはBeautiful Soup 3(別の結果が表示されている理由かもしれない)を前提としています。バージョン4を使用していて、他の回答を使用しているはずです。 – jadkik94

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

またはsoup.findAll(複数の同じ引数を使用する場合) –

+0

明らかにそのコードを使用しません。私の答えをチェックしてください。関連するバグレポートがあります。 – SuperSaiyan

+0

なぜ私のソリューションを落としたのか説明できますか?それは完璧に動作します。 –

0
soup.find_all('class') 

これは、HTMLソースですチェックは、このバグレポート:あなたが見ることができるようにhttps://bugs.launchpad.net/beautifulsoup/+bug/410304

、美しいスープは本当にclass="a b" 2などのクラスabを理解することはできません。

しかし、最初のコメントにあるように、単純な正規表現で十分です。あなたの場合:

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

注:これは最近のベータ版で修正されています。私は最近のバージョンのドキュメントを読んでいない、あなたはそれを行うことができるかもしれません。または、古いバージョンを使用して動作させる場合は、上記を使用できます。

17

美しいスープ4はjadkik94のソリューションを意味し、リストではなく、文字列として「class」属性の値を扱うことができます単純化すること:

​​
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")

だから、私はGEにしたい場合これは、BS4 documentationにすでにある

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") 

:何かのようにトンstackoverflow.comからクラスヘッダー<div class="header">のすべてのdivタグは、BeautifulSoupとの例は次のようになります。

関連する問題