如何查找具有特定父元素的元素?

3

我有一些HTML代码,如下:

<div class='cl1'>
    <div class='cl2'>text_1</div>
    <div class='cl3'>
        <div class='cl2'>text_2</div>
    </div>
</div>

我需要找到所有父元素为cl1的子元素中,class为cl2的元素。因此我需要获取text_1而非text_2。在简单的CSS中应该是这样的:

'div.cl1>div.cl2'

但我使用RobobrowserBeautifulSoup,当我尝试时

soup.select('div.cl1>div.cl2')

它说CSS选择器是错误的。


你的确切错误是什么? - Tristan
你能尝试一下加上空格,类似这样吗?'div.cl1 > .cl2' - Tristan
text_2div 也是 cl1 的子元素。 - Jan
@Jan,它不是一个子元素,而是一个后代元素。https://dev59.com/Y3M_5IYBdhLWcg3w4njb - Padraic Cunningham
2个回答

2

您的选择器走在正确的轨道上,您只需要将类名之间加上空格,即 div.cl1>div.cl2 应该改为 div.cl1 > div.cl2

In [5]: from bs4 import BeautifulSoup

In [6]: html = """<div class='cl1'>
    <div class='cl2'>text_1</div>
    <div class='cl3'>
        <div class='cl2'>text_2</div>
    </div>
</div>"""

In [7]: soup = BeautifulSoup(html, "html.parser")

In [8]: soup.select_one("div.cl1 > div.cl2") # good 
Out[8]: <div class="cl2">text_1</div>
In [9]: print(soup.select_one("div.cl1>div.cl2")) # bad
None

0

一个可能的解决方案是:

from bs4 import BeautifulSoup
data = """
<div class='cl1'>
    <div class='cl2'>text_1</div>
    <div class='cl3'>
        <div class='cl2'>text_2</div>
    </div>
</div>
"""
soup = BeautifulSoup(data)
divs = [div
        for div in soup.find_all("div", {'class': 'cl2'})
        if 'cl1' in div.parent["class"]]

# [<div class="cl2">text_1</div>]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接