BeautifulSoup中find()与find_all()方法用法及string参数lambda匹配疑问
BeautifulSoup find_all 方法 string 参数的运行逻辑
find_all 的 string 参数本身支持三类传入值,除了你认知里的普通字符串,还支持正则表达式、可调用对象:
- 传入普通字符串:精确匹配节点文本与字符串完全相等的节点
- 传入正则表达式:匹配文本符合正则规则的节点
- 传入可调用对象(如函数、lambda表达式):会将每个待匹配节点的文本作为参数传入该可调用对象,只要返回值为
True,该节点就会被命中,你写的代码正是用了这个特性。
你写的lambda text: "python" in text.lower()本质就是一个简化的可调用对象,等价于以下普通函数:
def has_python(text): return "python" in text.lower()
find_all遍历所有h2节点时,会依次把每个h2的文本传给这个lambda,只要返回True,就把对应的h2节点加入结果列表,完全符合你筛选包含python字符串的需求。
你设想的string=text if "python" in text写法无法生效的原因有两个:
- 这里的
text不是你可以直接引用的变量,是find_all遍历节点时才会动态生成的入参,你没有办法在调用find_all的时候直接访问到这个值 - 当
string参数接收可调用对象时,只需要你给出判断逻辑返回布尔值即可,不需要你返回匹配到的字符串本身,BeautifulSoup内部会自动收集所有符合判断条件的节点。
内容的提问来源于stack exchange,提问作者moonlight
相关产品推荐
相关产品推荐

