BeautifulSoup中使用lambda匹配.org链接为何需添加x and?
为什么必须在lambda里添加
x and? 这个问题其实是因为你忽略了HTML里的一个常见情况——不是所有<a>标签都带有href属性!
报错的根源
当你用soup.find_all('a', href=lambda x: ".org" in x)时,BeautifulSoup会遍历页面上所有的<a>标签:
- 对于带有
href属性的标签,x会是该属性的字符串值,这时候".org" in x能正常执行; - 但如果遇到没有
href的<a>标签(比如纯文本占位的<a>联系我们</a>),传给lambda的x就是None。
而None是不可迭代对象,你试图执行".org" in None时,Python就会抛出TypeError: argument of type 'NoneType' is not iterable的错误。
为什么x and能解决问题?
这要用到Python的短路求值特性:
- 当
x是None时,在布尔判断中等价于False,x and ".org" in x会直接返回False,不会执行后面的".org" in x,自然就避开了对None的迭代操作; - 当
x是有效的字符串(存在href属性)时,x在布尔判断中是True,表达式会继续执行".org" in x,完成你需要的匹配逻辑。
简单来说,x and就是给表达式加了一道“安全门”,先确认x不是空值,再执行后续的匹配判断。
内容的提问来源于stack exchange,提问作者shem
相关产品推荐
相关产品推荐

