如何找到具体父母的元素?

时间:2016-09-14 21:33:55

标签: python css-selectors beautifulsoup robobrowser

我有一些HTML:

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

我需要找到cl2类的任何项目,其中cl1作为父级,因此我需要 text_1 ,但不需要 text_2 。在简单的CSS中它应该是这样的:

'div.cl1>div.cl2'

但我使用 robobrowser BeautifulSoup ,当我尝试

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

它说css选择器错了。

2 个答案:

答案 0 :(得分:1)

您的选择器位于正确的轨道上,您只需要将类别分隔开,即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

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