为了账号安全,请及时绑定邮箱和手机立即绑定

美丽的汤 - 选择所有具有类的元素,但如果它们还有其他类,也将它们分开或忽略元素

美丽的汤 - 选择所有具有类的元素,但如果它们还有其他类,也将它们分开或忽略元素

慕婉清6462132 2022-07-05 19:27:02
我有以下结构:<div class="alpha"><div class="alpha"><div class="alpha"><div class="alpha betha"><div class="alpha gama"><div class="alpha">我需要获取列表中只有“alpha”作为类的所有元素。在另一个列表中获取所有具有 'alpha' 和 'betha' 的元素。忽略其他组合,如“alpha gama”。我知道我可以获得所有具有类的元素container.findAll('div', {'class': 'alpha'})但是如何区分/忽略 2 和 3。
查看完整描述

2 回答

?
缥缈止盈

TA贡献2041条经验 获得超4个赞

您可以通过以下方法使用 CSS 选择器.select():


txt = '''<div class="alpha">1</div>

<div class="alpha">2</div>

<div class="alpha">3</div>

<div class="alpha betha">4</div>

<div class="betha alpha">5</div>

<div class="alpha betha gama">6</div>

<div class="alpha gama">7</div>

<div class="alpha">8</div>'''


from bs4 import BeautifulSoup


soup = BeautifulSoup(txt, 'html.parser')


only_alpha = soup.select('[class="alpha"]')

only_alpha_betha = soup.select('.alpha.betha:not(.gama)')


print('Only alpha:', only_alpha)

print('Only alpha and betha:', only_alpha_betha)

印刷:


Only alpha: [<div class="alpha">1</div>, <div class="alpha">2</div>, <div class="alpha">3</div>, <div class="alpha">8</div>]

Only alpha and betha: [<div class="alpha betha">4</div>, <div class="betha alpha">5</div>]



查看完整回答
反对 回复 2022-07-05
?
PIPIONE

TA贡献1829条经验 获得超9个赞

为什么不创建一个辅助函数?


bs4 允许您在使用find_all()a function as filter搜索树时指定。


从文档:


如果其他匹配项都不适合您,请定义一个将元素作为唯一参数的函数。True 如果参数匹配,则函数应返回,False否则返回。


问题是我们不能传递任何其他参数(在这种情况下是有效类的列表)。我们可以通过使用包装函数来动态创建过滤器来克服这个问题。


def create_filter(tag_name, class_list):

    def class_filter(tag):

        return (

            tag.name == tag_name and

            set(tag.get('class', [])) == set(class_list)

        )

    return class_filter

让我们看看这在 @AndrejKesely 的示例 html 上是如何工作的。


仅有的alpha


print(soup.find_all(create_filter('div', ['alpha'])))

输出


[<div class="alpha">1</div>, <div class="alpha">2</div>, <div class="alpha">3</div>, <div class="alpha">8</div>]

只有alpha和betha


print(soup.find_all(create_filter('div', ['alpha', 'betha'])))

输出


[<div class="alpha betha">4</div>, <div class="betha alpha">5</div>]


查看完整回答
反对 回复 2022-07-05
  • 2 回答
  • 0 关注
  • 96 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信