BeautifulSoup, как проиндексировать тег объекта - PullRequest
0 голосов
/ 26 мая 2018

У меня есть этот 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>

, который является вторым tr с классом 'even'.Я хочу извлечь отсюда второй тд ака Plupp и 3-й ака 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 голосов
/ 27 мая 2018

Первая строка возвращает массив со всеми тегами tr с атрибутом класса "even".Селектор индекса массива [1] говорит, что нужно выбрать второй тег tr в массиве (помните, что массивы начинаются с 0).

На данный момент объект tr не является массивом или какой-либо коллекцией, которую вы использовали бы в скобкахна это красивый объект тега супа.Ошибка говорит о том, что [2] не является допустимой операцией для объекта tr.

0 голосов
/ 27 мая 2018

Ваша проблема начинается с:

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.
...