Получение n-го элемента с помощью BeautifulSoup - PullRequest
21 голосов
/ 04 января 2012

Из большой таблицы я хочу прочитать строки 5, 10, 15, 20 ... используя BeautifulSoup. Как мне это сделать? Можно ли найти findNextSibling и инкрементный счетчик?

Ответы [ 4 ]

44 голосов
/ 04 января 2012

Вы также можете использовать findAll, чтобы получить все строки в списке, и после этого просто использовать синтаксис слайса для доступа к нужным элементам:

rows = soup.findAll('tr')[4::5]
4 голосов
/ 27 августа 2015

Это можно легко сделать с помощью select в красивом супе, если вы знаете номера строк, которые нужно выбрать.(Примечание: это в bs4)

row = 5
while true
    element = soup.select('tr:nth-of-type('+ row +')')
    if len(element) > 0:
        # element is your desired row element, do what you want with it 
        row += 5
    else:
        break
1 голос
/ 04 января 2012

Другой вариант, если вы предпочитаете сырой HTML ...

"""Build a small table with one column and ten rows, then parse it into a list"""
htstring = """<table> <tr> <td>foo1</td> </tr> <tr> <td>foo2</td> </tr> <tr> <td>foo3</td> </tr> <tr> <td>foo4</td> </tr> <tr> <td>foo5</td> </tr>  <tr> <td>foo6</td> </tr>  <tr> <td>foo7</td> </tr>  <tr> <td>foo8</td> </tr>  <tr> <td>foo9</td> </tr>  <tr> <td>foo10</td> </tr></table>"""
result = [html_tr for idx, html_tr in enumerate(soup.findAll('tr')) \
     if (idx+1)%5==0]
print result

Запуск этого ...

[mpenning@Bucksnort ~]$ python testme.py
[<tr> <td>foo5</td> </tr>, <tr> <td>foo10</td> </tr>]
[mpenning@Bucksnort ~]$
1 голос
/ 04 января 2012

В качестве общего решения вы можете преобразовать таблицу во вложенный список и выполнить итерацию ...

import BeautifulSoup

def listify(table):
  """Convert an html table to a nested list""" 
  result = []
  rows = table.findAll('tr')
  for row in rows:
    result.append([])
    cols = row.findAll('td')
    for col in cols:
      strings = [_string.encode('utf8') for _string in col.findAll(text=True)]
      text = ''.join(strings)
      result[-1].append(text)
  return result

if __name__=="__main__":
    """Build a small table with one column and ten rows, then parse into a list"""
    htstring = """<table> <tr> <td>foo1</td> </tr> <tr> <td>foo2</td> </tr> <tr> <td>foo3</td> </tr> <tr> <td>foo4</td> </tr> <tr> <td>foo5</td> </tr>  <tr> <td>foo6</td> </tr>  <tr> <td>foo7</td> </tr>  <tr> <td>foo8</td> </tr>  <tr> <td>foo9</td> </tr>  <tr> <td>foo10</td> </tr></table>"""
    soup = BeautifulSoup.BeautifulSoup(htstring)
    for idx, ii in enumerate(listify(soup)):
        if ((idx+1)%5>0):
            continue
        print ii

Запуск этого ...

[mpenning@Bucksnort ~]$ python testme.py
['foo5']
['foo10']
[mpenning@Bucksnort ~]$
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...