2012-01-04 20 views

Trả lời

31

Bạn cũng có thể sử dụng findAll để có được tất cả các hàng trong một danh sách và sau đó chỉ cần sử dụng cú pháp lát để truy cập các yếu tố mà bạn cần:

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

Điều này là sạch. Lưu ý rằng phương thức find all trả về một mảng, vì vậy điều này là rất tốt. – JasTonAChair

1

Là một giải pháp chung, bạn có thể chuyển đổi bàn vào một danh sách lồng nhau và lặp ...

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 

Chạy rằng ...

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

Một lựa chọn khác, nếu bạn thích html liệu ...

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

Chạy rằng ...

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

này có thể dễ dàng thực hiện với select trong súp đẹp nếu bạn biết những con số hàng để được lựa chọn . (Lưu ý: Đây là trong 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