2012-01-04 2 views

ответ

31

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

rows = soup.findAll('tr')[4::5] 
+0

Это чисто. Обратите внимание, что метод find all возвращает массив, поэтому это здорово. – JasTonAChair

1

Как общее решение, вы можете конвертировать таблицу для вложенного списка и итерация ...

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 

Бег что ...

[[email protected] ~]$ python testme.py 
['foo5'] 
['foo10'] 
[[email protected] ~]$ 
1

Другой вариант, если вы предпочитаете сырой 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 

Бег что ...

[[email protected] ~]$ python testme.py 
[<tr> <td>foo5</td> </tr>, <tr> <td>foo10</td> </tr>] 
[[email protected] ~]$ 
1

Это можно легко сделать с 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 
Смежные вопросы