无法使用bs4提取网页表格,能否通过requests获取页面var model数据?
实现方案
完全可以通过requests直接获取目标数据,无需依赖Selenium。你观察到的var model变量就是完整的源数据,直接提取解析即可,具体步骤如下:
- 第一步:用requests请求目标接口获取页面原始文本
- 第二步:通过正则匹配提取
var model后的JSON字符串 - 第三步:将JSON字符串转成Python字典,按需提取字段转成表格即可
完整实现代码
import requests import re import json import pandas as pd # 目标接口地址 url = "https://api.ofx.com/PublicSite.ApiService/SpotRateHistory/allTime/USD/ARS?DecimalPlaces=8&ReportingInterval=yearly" # 加UA模拟浏览器请求,避免被接口拦截 headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" } # 发送请求获取响应文本 resp = requests.get(url, headers=headers) html_text = resp.text # 正则匹配提取var model后的JSON内容 match_res = re.search(r'var model = (.*?),\s*txt =', html_text, re.S) if match_res: model_json_str = match_res.group(1).strip() # 转成Python字典 model_data = json.loads(model_json_str) # 提取历史汇率点直接转DataFrame表格 history_df = pd.DataFrame(model_data['HistoricalPoints']) # 可选:将毫秒时间戳转成可读日期格式 history_df['PointInTime'] = pd.to_datetime(history_df['PointInTime'], unit='ms') # 打印结果验证 print(history_df) # 可以直接导出为csv等格式 # history_df.to_csv("usd_ars_yearly_rate.csv", index=False)
补充说明
你之前用bs4和pd.read_html拿不到表格是因为表格是前端拿到model数据后动态生成的,原始HTML里只有空的table标签,没有实际内容,直接提取源数据是当前场景下的最优解,效率远高于动态渲染方案。
内容的提问来源于stack exchange,提问作者JPWilson
相关产品推荐
相关产品推荐

