Python美丽的汤4使用.select()获取元素的子元素

时间:2017-01-10 05:55:38

标签: python css python-3.x beautifulsoup bs4

.select()元素允许我基于css选择器从网页中获取元素,但这将搜索整个网页。我如何使用.select()但只搜索特定元素的子元素。 E.g:

DataTable

我想说一句话: for byte[] [0] foo包含值<!-- 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> ,bar包含值<li>等。

目前我的解决方案如下:

"foo content"

这在很大程度上起作用。但是当一个元素缺少一个元素时,它完全崩溃了。就像我在HTML中展示的一样,我们不能假设三个bar,baz和foo元素都会出现。

因此,我如何只搜索lis的孩子。因此,我可以这样做:

"bar content"

3 个答案:

答案 0 :(得分: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>]

答案 1 :(得分:0)

for li in soup.select('li'):
    foo = li.select('.foo')
    bar = li.select('.bar')
    baz = li.select('.baz')

每次迭代li代码并使用select()时,要选择的html代码只是li代码的内容,例如:

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

因此,您可以使用select()来选择孩子,因为li只包含子标记。

答案 2 :(得分:0)

这对我有用,所有的foos,bar和baz都存储在单独的列表中

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(_)