求助:使用Beautiful Soup抓取同一页面不同区域的多表格
如何抓取同一页面中的多个表格?
你的代码目前只能获取页面里的第一个表格,问题出在soup.find('tbody')——find()方法只会返回第一个匹配到的元素。要抓取页面上所有表格,我们只需要把find()换成find_all(),再遍历所有匹配结果就可以了。
修改后的代码方案一(直接获取所有tbody)
这个方案适合页面里所有表格都有<tbody>标签的情况:
import requests from bs4 import BeautifulSoup url = "https://www.predictit.org/Contract/5367/Will-Donald-Trump-be-president-at-year-end-2018#prices" r = requests.get(url) data = r.text soup = BeautifulSoup(data,"html.parser") # 获取页面中所有的tbody元素(每个tbody对应一个表格的主体) all_table_bodies = soup.find_all('tbody') # 遍历每个表格,用enumerate给表格加序号方便区分 for table_num, table_body in enumerate(all_table_bodies, start=1): print(f"--- 第 {table_num} 个表格 ---") rows = table_body.find_all('tr') for row in rows: cols = row.find_all('td') cols = [x.text.strip() for x in cols] print(cols) print("\n")
更健壮的方案二(先找所有table标签)
有些网站的表格可能没有<tbody>标签,直接把行放在<table>下,这个方案能兼容这种情况:
import requests from bs4 import BeautifulSoup url = "https://www.predictit.org/Contract/5367/Will-Donald-Trump-be-president-at-year-end-2018#prices" r = requests.get(url) data = r.text soup = BeautifulSoup(data,"html.parser") # 获取页面中所有的<table>元素 all_tables = soup.find_all('table') for table_num, table in enumerate(all_tables, start=1): print(f"--- 第 {table_num} 个表格 ---") # 先尝试找表格里的tbody table_body = table.find('tbody') if table_body: rows = table_body.find_all('tr') else: # 如果没有tbody,直接从table里找行 rows = table.find_all('tr') # 处理每一行的数据 for row in rows: cols = row.find_all('td') cols = [x.text.strip() for x in cols] print(cols) print("\n")
关键改动说明:
- 用
find_all()替代find():find_all()会返回页面中所有匹配的元素列表,而不是单个元素 - 增加表格序号:用
enumerate()给每个表格加上编号,方便你区分不同区域的表格 - 兼容无tbody的表格:方案二会先检查表格是否有tbody,没有的话直接从table标签下取行,避免报错或遗漏数据
内容的提问来源于stack exchange,提问作者Eric Hoffer




