BeautifulSoup如何索引标记对象

时间:2018-05-26 20:58:44

标签: python object indexing beautifulsoup tags

我有这个HTML代码:

<tr class="even">
  <td style="background: #8FB9B0; color: #8FB9B0;">0&#160;</td>
  <td>Plupp</td>
  <td class="right">RIFLEMAN</td>
  <td class="right">139</td>
  <td class="right">6</td>
  <td class="right">30</td>
  <td class="right" title="Packet loss: ">64</td>
  <td class="center">No</td>
  <td class="center">No</td>
  <td class="center">Yes</td>

这是第二个带有'even'类的tr。我想从这里提取第二个td aka Plupp和第三个又名RIFLEMAN

请帮助我理解我做错了什么,这是我的代码:

tr = soup.find_all('tr', class_='even')[1]
a = tr[2].find('td')

我收到此错误:

  File "test.py", line 45, in <module>
    a = tr[2].find('td')
  File "C:\Python27\lib\site-packages\bs4\element.py", line 1011, in __getitem__
    return self.attrs[key]
KeyError: 2

2 个答案:

答案 0 :(得分:2)

您的问题始于:

tr = soup.find_all('tr', class_='even')[1]

行末尾的[1]表示返回的内容是单个标记,而不是标记列表,但在下一行中:

a = tr[2].find('td')

你试图索引一个没有索引的对象,我可以建议你实现目标的方法是用以下代码替换这一行:

tds = tr.find_all("td") # returns a list of td's within the tr
a = tds[2] # accesses RIFLEMAN
b = tds[1] # accesses Pupp.

答案 1 :(得分:1)

第一行是返回一个数组,其中所有tr标签的类属性为“even”。 [1]数组索引选择器表示选择数组中的第二个tr标记(记住数组从0开始)。

此时tr对象不是数组或任何类型的集合,你会使用括号,它是一个漂亮的汤标记对象。错误是说[2]不是对tr对象执行的有效操作。