BeautifulSoup报”TypeError: ‘str’ object is not callable “异常的原因以及解决办法

  • Post category:Python

错误提示”TypeError: ‘str’ object is not callable”通常是由BeautifulSoup生成时所传入的字符串类型参数引起的。具体来说,当BeautifulSoup对象以字符串作为参数,并且在后续代码中试图像函数一样调用时,就会出现这个错误。下面是可能导致这个问题的一些常见情况。

  1. 将字符串作为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>]
  1. 将变量或对象作为参数传递

另一个可能导致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方法来获取文档中的元素。