如何在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
相关产品推荐
相关产品推荐

