3

我有一些 HTML,例如:

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

我需要找到以 cl1 作为父级的 cl2 类的任何项目,所以我需要获取text_1而不是text_2。在简单的 css 中应该是这样的:

'div.cl1>div.cl2'

但我使用robobrowserBeautifulSoup,当我尝试

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

它说css选择器是错误的。

4

2 回答 2

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
于 2016-09-14T23:42:22.543 回答
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>]
于 2016-09-14T21:53:49.797 回答