2017-01-10 52 views
0

.select()元素允許我從基於css選擇器的網頁獲取元素,但是這將搜索整個網頁。我將如何使用.select(),但只搜索特定元素的子元素。例如:Python美麗的湯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 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中展示的那樣,我們不能假定三個bar,baz和foo元素都會出現。

因此,我將如何只搜索兒童。因此,我可以做這樣的事情:

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 

輸出:在每次迭代li標籤時

[<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') 

和使用select(),要選擇的html代碼只是li標籤的內容,lik E:

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

所以,你可以使用select()選擇裏的孩子,因爲李只包含子標籤。

0

這個工作對我和所有的Foo,酒吧和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(_)