You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Python的BeautifulSoup中使用嵌套find_all语句?

解决BeautifulSoup多条件筛选tr标签的问题

你当前的写法存在语法错误,因为find_all()不支持用and组合这种元组参数。要同时满足class不以hidden开头和id以version_new_开头的tr标签,有两种常用的可行方法:

方法一:用lambda函数作为attrs参数

直接在attrs中传入lambda函数,同时校验class和id的条件:

query = soup.find_all("tr", attrs=lambda tag: 
    tag.get("id", "").startswith("version_new_") 
    and not tag.get("class", [""])[0].startswith("hidden")
)
print(query)
  • tag.get("id", ""):获取元素的id属性,若不存在则返回空字符串,避免触发属性不存在的报错
  • startswith("version_new_"):匹配id以指定前缀开头的元素
  • tag.get("class", [""])[0]:取class列表的第一个值(class是多值属性),若元素无class则返回空列表的第一个空元素
  • not ...startswith("hidden"):排除class以hidden开头的元素

方法二:使用CSS选择器(更简洁)

BeautifulSoup支持CSS选择器语法,用select()方法可以直接写出组合筛选条件:

query = soup.select('tr[id^="version_new_"]:not([class^="hidden"])')
print(query)
  • [id^="version_new_"]:匹配id以version_new_开头的tr元素
  • :not([class^="hidden"]):排除class以hidden开头的tr元素
  • select()返回的结果格式和find_all()一致,都是标签对象组成的列表

另外需要纠正你之前的一个小问题:class_=lambda x: x != "hidden*"的写法逻辑不对,x是class的实际属性值,"hidden*"是通配符,不能直接用!=判断,必须用startswith()这类字符串方法来匹配前缀规则。

内容的提问来源于stack exchange,提问作者Acuity

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 21:10:27