You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:无法使用Beautiful Soup提取新西兰议会法案网页表格

解决新西兰议会法案表格提取问题

问题原因

你用requests获取的是静态HTML,但目标表格是通过JavaScript动态渲染的,静态页面里没有表格数据,所以BeautifulSoup找不到对应元素。

解决方案1:使用Selenium模拟浏览器加载

Selenium会模拟真实浏览器加载页面,等待JS渲染完成后再提取数据:

  1. 先安装依赖:
pip install selenium pandas
  1. 下载对应浏览器的驱动(比如ChromeDriver),确保和浏览器版本匹配,放在可执行路径下。

  2. 编写代码:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import pandas as pd

# 初始化Chrome浏览器(其他浏览器同理)
driver = webdriver.Chrome()
url = "https://bills.parliament.nz/bills-proposed-laws?Tab=All&Period=0&To=2023-05-22&From=2018-01-01&SelectCommittee=a0f103be-0902-4480-9778-93a5229dca71"
driver.get(url)

# 等待表格加载完成(等待目标表格的tbody节点出现)
wait = WebDriverWait(driver, 10)
table_body = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, "table tbody")))

# 逐行提取表格数据
rows = table_body.find_elements(By.TAG_NAME, "tr")
data = []
for row in rows:
    cols = row.find_elements(By.TAG_NAME, "td")
    row_data = [col.text.strip() for col in cols]
    # 提取法案详情链接
    link_elem = row.find_element(By.CSS_SELECTOR, "a")
    row_data.append(link_elem.get_attribute("href"))
    data.append(row_data)

# 获取表头文本
headers = [header.text.strip() for header in driver.find_elements(By.CSS_SELECTOR, "table th")]
headers.append("法案链接")

# 转换为DataFrame格式
df = pd.DataFrame(data, columns=headers)
print(df)

# 关闭浏览器
driver.quit()

解决方案2:直接调用后台API(更高效)

通过浏览器开发者工具的网络面板,可以找到页面加载表格数据的API接口,直接请求接口获取JSON数据,无需渲染页面:

import requests
import pandas as pd

# 从页面网络请求中捕获的API接口
api_url = "https://bills.parliament.nz/api/bills/search"
payload = {
    "tab": "All",
    "period": 0,
    "to": "2023-05-22",
    "from": "2018-01-01",
    "selectCommittee": "a0f103be-0902-4480-9778-93a5229dca71",
    "page": 1,
    "pageSize": 100  # 调整每页数据量,减少分页请求次数
}

# 发送POST请求获取数据
response = requests.post(api_url, json=payload)
data = response.json()

# 提取核心数据转换为DataFrame
df = pd.DataFrame(data["items"])
# 按需选择展示列,比如法案名称、状态、提交日期等
print(df[["title", "status", "introducedDate", "lastUpdated"]])

注:API参数可能随网站更新变化,若失效可重新通过浏览器开发者工具查看最新请求参数和接口地址。

内容的提问来源于stack exchange,提问作者Adithyapranav Gupta Kolluru

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 09:15:10