You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

求助:使用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

火山引擎 最新活动