2017-01-10 9 views
0

.select()要素を使用すると、CSSセレクタに基づいてWebページから要素を取得できますが、Webページ全体を検索します。 .select()はどのように使うのですか?特定の要素の子だけを検索します。例:Python Beautiful Soup 4 .select()で要素の子を取得

<!-- Simplified example of the structure --> 
<ul> 
    <li> 
     <div class="foo">foo content</div> 
     <div class="bar">bar content</div> 
     <div class="baz">baz content</div> 
    </li> 
    <li> 
     <!-- We can't assume that foo, bar, and baz will always be there --> 
     <div class="foo">foo content</div> 
     <div class="baz">baz content</div> 
    </li> 
    <li> 
     <div class="foo">foo content</div> 
     <div class="bar">bar content</div> 
     <div class="baz">baz content</div> 
    </li> 
</ul> 

私が言う方法をしたい:<li>ため [0] fooが値"foo content"が含まれて、バーが値"bar content"などが含まれてい...

現在、私の解決策は以下の通りです:

foos = soup.select("div.foo") 
bars = soup.select("div.bar") 
bazs = soup.select("div.baz") 

for i in range(len(foos)): 
    print("{i} contains: {} and {} and {}".format(i=i, foos[i], bars[i], bazs[i])) 

これはほとんどの場合有効です。しかし、それは要素が唯一のものから欠けているとき完全に崩壊する。私がHTMLで示したように、3つのbar、baz、foo要素が存在するとは想定できません。

したがって、私はどのようにしてlisの子のみを検索しますか?

for i in soup.select("li"): 
    #how would i do this: 
    foo = child_of("li", "div.foo")???? 
    bar = child_of("li", "div.bar")???? 
    baz = child_of("li", "div.baz")???? 

答えて

1

あなたがそうのようなelement:nth-of-type(n)を使用することができます:したがって、私はこのような何かを行うことができ

from bs4 import BeautifulSoup 

a = """<!-- Simplified example of the structure --> 
<ul> 
    <li> 
     <div class="foo">foo1 content</div> 
     <div class="bar">bar1 content</div> 
     <div class="baz">baz1 content</div> 
    </li> 
    <li> 
     <!-- We can't assume that foo, bar, and baz will always be there --> 
     <div class="foo">foo2 content</div> 
     <div class="baz">baz2 content</div> 
    </li> 
    <li> 
     <div class="foo">foo3 content</div> 
     <div class="bar">bar3 content</div> 
     <div class="baz">baz3 content</div> 
    </li> 
</ul> 
""" 

s = BeautifulSoup(a) 
s2 = s.select('ul > li:nth-of-type(2)')[0] 
foo, bar, baz = s2.select('div.foo'), s2.select('div.bar'), s2.select('div.baz') 
print foo, bar, baz 

出力:

[<div class="foo">foo2 content</div>] [] [<div class="baz">baz2 content</div>] 
0
for li in soup.select('li'): 
    foo = li.select('.foo') 
    bar = li.select('.bar') 
    baz = li.select('.baz') 

あなたはliタグを反復処理するたびにとselect()を使用すると、選択されるhtmlコードはliタグのコンテンツのみですE:Liは唯一の子タグが含まれているため

<li> 
    <div class="foo">foo content</div> 
    <div class="bar">bar content</div> 
    <div class="baz">baz content</div> 
</li> 

だから、あなたは、Liの子を選択するために、select()を使用することができます。

0

これは私のために働いたし、すべてのFOOS、バー、bazsは別々のリスト

foos = [] 
bars = [] 
bazs = [] 
for i in soup.find_all('li'): 
    soup2 = BeautifulSoup(str(i)) 
    print soup2 
    for _ in soup2.find_all('div', {'class':'foo'}): 
     foos.append(_) 
    for _ in soup2.find_all('div', {'class': 'bar'}): 
     bars.append(_) 
    for _ in soup2.find_all('div', {'class': 'baz'}): 
     bazs.append(_) 
に格納されています
関連する問題