gpt4 book ai didi

python - 在 BeautifulSoup 中使用 lambda 函数

转载 作者:行者123 更新时间:2023-11-28 17:07:56 25 4
gpt4 key购买 nike

尝试匹配包含特定文本的链接。我在做

links = soup.find_all('a',href=lambda x: ".org" in x)

但这会引发 TypeError: argument of type 'NoneType' is not iterable。

正确的做法显然是

links = soup.find_all('a',href=lambda x: x and ".org" in x)

为什么这里需要额外的 x 和

最佳答案

原因很简单:<a> 之一您的 HTML 中的标签没有 href属性(property)。


这是一个重现异常的最小示例:

html = '<html><body><a>bar</a></body></html>'
soup = BeautifulSoup(html, 'html.parser')

links = soup.find_all('a', href=lambda x: ".org" in x)
# result:
# TypeError: argument of type 'NoneType' is not iterable

现在如果我们添加一个 href属性,异常消失:

html = '<html><body><a href="foo.org">bar</a></body></html>'
soup = BeautifulSoup(html, 'html.parser')

links = soup.find_all('a', href=lambda x: ".org" in x)
# result:
# [<a href="foo.org">bar</a>]

发生的事情是 BeautifulSoup 正在尝试访问 <a>标签的 href属性,返回 None当属性不存在时:

html = '<html><body><a>bar</a></body></html>'
soup = BeautifulSoup(html, 'html.parser')

print(soup.a.get('href'))
# output: None

这就是为什么有必要允许 None lambda 中的值。自 None是一个假值,代码x and ...阻止 and 的右侧x 时执行的语句是None ,正如您在这里看到的:

>>> None and 1/0
>>> 'foo.org' and 1/0
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ZeroDivisionError: division by zero

这叫做 short-circuiting .


也就是说,x and ...检查 x 的真实性, 和 None不是唯一被认为是虚假的值(value)。所以比较x会更正确至 None像这样:

lambda x: x is not None and ".org" in x

关于python - 在 BeautifulSoup 中使用 lambda 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49840504/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com