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

2024-05-02 02:26:00 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下html:

<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">容器的子元素,但不是{}容器中的子元素。在

当我这样做时:

^{pr2}$

我取回了所有的<p>标记,包括<div class='not-what-im-after>内的标记,这对我来说完全有意义;这就是我所要求的。在

我的问题是如何指示Python获取所有的<p>标记,除非它们在另一个子元素中?在


Tags: 标记div元素内容htmlnotcontentwhat
3条回答
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子级

如果只希望what-im-afterdiv下的p标记不在任何其他标记内,则需要设置recursive=False

soup = BeautifulSoup(html)

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

这与循环逻辑检查父对象完全相同。在

在写这个问题的过程中,我想到了一个似乎很有效的方法。在

基本上,我检查每个<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然后包含所有未嵌套在其他子元素中的<p>标记。在

相关问题 更多 >