📜  ResultSet 对象没有属性“get_text”.您可能将元素列表视为单个元素.当您打算调用 find() 时,您是否调用了 find_all()? - 打字稿(1)

📅  最后修改于: 2023-12-03 15:34:43.174000             🧑  作者: Mango

ResultSet 对象没有属性“get_text”

当使用 Beautiful Soup 库解析 HTML 或 XML 文件时,我们经常使用 find()find_all() 方法来查找我们需要的元素。这两个方法返回的结果是一个 ResultSet 对象,它包含了所有符合条件的元素。

然而,有时候我们在对这些元素进行进一步处理时,可能会遇到 ResultSet 对象没有 get_text() 等方法的问题。这个错误是因为我们将 ResultSet 对象当作单个元素来处理,而不是遍历 ResultSet 中的每个元素进行处理。

举个例子,假设我们想要将一个 HTML 表格的所有行提取出来,并打印每行中的文本内容。下面是一个简单的示例代码:

from bs4 import BeautifulSoup

html = """
<table>
  <tr>
    <td>1</td>
    <td>2</td>
    <td>3</td>
  </tr>
  <tr>
    <td>4</td>
    <td>5</td>
    <td>6</td>
  </tr>  
</table>
"""

soup = BeautifulSoup(html, 'html.parser')
rows = soup.find_all('tr')

for row in rows:
    print(row.get_text())

然而,这段代码会抛出以下错误:

AttributeError: ResultSet object has no attribute 'get_text'. You're probably treating a list of elements like a single element. Did you call find_all() when you meant to call find()?

这是因为 row 对象是一个 ResultSet 对象,它包含了当前行中的所有元素。因此,当我们使用 row.get_text() 时,我们实际上是将一个 ResultSet 对象当作单个元素来处理,这是不正确的。

为了解决这个问题,我们需要使用循环遍历 ResultSet,并对每个元素进行处理。我们可以通过将 ResultSet 对象转换为列表的方式,实现对每个元素的遍历。修改上述代码如下:

from bs4 import BeautifulSoup

html = """
<table>
  <tr>
    <td>1</td>
    <td>2</td>
    <td>3</td>
  </tr>
  <tr>
    <td>4</td>
    <td>5</td>
    <td>6</td>
  </tr>  
</table>
"""

soup = BeautifulSoup(html, 'html.parser')
rows = soup.find_all('tr')

for row in rows:
    cells = list(row.children)
    cell_texts = [cell.get_text() for cell in cells]
    print(cell_texts)

我们首先对 ResultSet 对象 rows 进行遍历,对于每行 row,我们将它的子元素转换为列表 cells,再通过列表推导式获取每个元素的文本 cell_texts,最后将文本打印出来。

这样,我们就完美地解决了 ResultSet 对象没有 get_text() 方法的问题。