错误提示”TypeError: ‘str’ object is not callable”通常是由BeautifulSoup生成时所传入的字符串类型参数引起的。具体来说,当BeautifulSoup对象以字符串作为参数,并且在后续代码中试图像函数一样调用时,就会出现这个错误。下面是可能导致这个问题的一些常见情况。
- 将字符串作为BeautifulSoup的参数
当以字符串形式传递HTML或XML对象时,BeautifulSoup会将其解析为文档树,并将其封装在BeautifulSoup对象中。这个对象可以被视为文档树的根节点。但是,如果你试图像调用函数一样使用BeautifulSoup对象,那么会产生上述错误。下面是一个示例代码:
from bs4 import BeautifulSoup
html = "<html><head><title>Test</title></head><body><p>Paragraph 1</p><p>Paragraph 2</p></body></html>"
soup = BeautifulSoup(html, "html.parser")
p = soup("p")
执行上面的代码会报错,提示TypeError: ‘str’ object is not callable。这是因为("p")
是试图调用“soup”对象,但是它是一个字符串,而不是一个函数。相反,我们应该使用soup.find_all("p")
或soup("p")
方法来获取文档中的所有段落。
from bs4 import BeautifulSoup
html = "<html><head><title>Test</title></head><body><p>Paragraph 1</p><p>Paragraph 2</p></body></html>"
soup = BeautifulSoup(html, "html.parser")
p = soup.find_all("p")
print(p)
输出结果:
[<p>Paragraph 1</p>, <p>Paragraph 2</p>]
- 将变量或对象作为参数传递
另一个可能导致TypeError的原因是,当我们将包含字符串的变量或其他对象作为参数传递给BeautifulSoup时,可以通过在变量或对象名称末尾添加()
来使用它们的方法,从而导致与字符串的情况相同的问题。下面是一个示例代码:
from bs4 import BeautifulSoup
html = "<html><head><title>Test</title></head><body><p>Paragraph 1</p><p>Paragraph 2</p></body></html>"
soup = BeautifulSoup(html, "html.parser")
tag = "p"
p = soup(tag)
print(p)
同样地,上述代码会产生TypeError。因此,我们应该删除tag作为函数的试图调用,只是将其作为一个字符串传递给find_all方法。
from bs4 import BeautifulSoup
html = "<html><head><title>Test</title></head><body><p>Paragraph 1</p><p>Paragraph 2</p></body></html>"
soup = BeautifulSoup(html, "html.parser")
tag = "p"
p = soup.find_all(tag)
print(p)
输出结果:
[<p>Paragraph 1</p>, <p>Paragraph 2</p>]
综上所述,解决TypeError的方法是确保在使用字符串作为参数时,不要将其作为函数调用,并使用find_all方法来获取文档中的元素。