在Beautifulsoup4中,获取元素的所有子元素,但不获取子元素的子元素

时间:2016-07-28 01:26:07

标签: python web-scraping beautifulsoup

我有以下html:

gradle

我正在尝试从<div class="what-im-after"> <p> "content I want" </p> <p> "content I want" </p> <p> "content I want" </p> <div class='not-what-im-after"> <p> "content I don't want" </p> </div> <p> "content I want" </p><p> "content I want" </p> </div> 容器的子元素段落标记中提取所有内容,而不是在<div class="what-im-after">容器中找到的内容。

当我这样做时:

<div class="not-what-im-after">

我收回了所有soup = Beautifulsoup(html.text, 'lxml') content = soup.find('div', class_='what-im-after').findAll('p') 个标签,包括<p>内的标签,这对我来说是完全合理的;这就是我要求的。

我的问题是如何指示Python获取所有<div class='not-what-im-after>标记,除非它们位于另一个SubElement中?

3 个答案:

答案 0 :(得分:1)

如果你只想在what-im-after div下面的p标签不在任何其他标签内,你想要设置 recursive = False

soup = BeautifulSoup(html)

print(soup.find('div', class_='what-im-after').find_all("p", recursive=False))

这与检查父级的循环逻辑完全相同。

答案 1 :(得分:0)

在写这个问题的过程中,我想到了一种似乎工作正常的方法。

基本上,我正在检查每个<p>元素以查看父元素是否为<p>,这实际上排除了嵌套在子元素中的任何<div class="what-im-after">标记。

我的代码如下:

<p>

filter_list = [] parent = soup.find('div', class_='what-im-after') content = soup.find('div', class_='what-im-after').findAll('p') if content.parent is parent: filter_list.append(content) 然后包含未嵌套在其他子元素中的所有filter_list标记。

答案 2 :(得分:-1)

from bs4 import BeautifulSoup

htmltxt = """<div class="what-im-after">
    <p>
        "content I want"
    </p>
    <p>
        "content I want"
    </p>
    <p>
        "content I want"
    </p>
    <div class='not-what-im-after">
        <p>
            "content I don't want"
        </p>
    </div>
    <p>
        "content I want"
    </p><p>
        "content I want"
    </p>
</div>"""

soup = BeautifulSoup(htmltxt, 'lxml')


def filter_p(container):
    items = container.contents
    ans = []
    for item in items:
        if item.name == 'p':
            ans.append(item)
    return ans

print(filter_p(soup.div))

也许你想要这个。 而我只是过滤了div的第一级p。