2017-01-10 86 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(_)