Từ một bảng lớn, tôi muốn đọc các hàng 5, 10, 15, 20 ... bằng cách sử dụng BeautifulSoup. Làm thế nào để tôi làm điều này? Là findNextSibling và tăng truy cập một cách để đi?Lấy phần tử thứ n bằng cách sử dụng BeautifulSoup
14
A
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]
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
Đ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