Python爬取JS加载的基金表格指定行数据失败如何解决?
问题定位
- 原脚本运行失败的核心原因是
render()方法默认等待时间过短,页面JavaScript还未完成表格渲染就已经返回了HTML内容,因此无法定位到目标表格 - 未添加请求头容易被站点反爬机制拦截,返回无有效内容的空白页面
- 多类名查找的写法容错性较低,实际渲染后表格class属性存在空格分隔的多个类名,直接全匹配容易失效
修复后完整代码
from bs4 import BeautifulSoup from requests_html import HTMLSession # 配置目标基金列表,填入需要提取的基金全称/缩写即可 target_funds = ["Public Equity Fund", "PEF", "Public Balanced Fund", "PBF"] # 配置请求头避免反爬拦截 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" } session = HTMLSession() url = 'https://www.publicmutual.com.my/Our-Products/UT-Fund-Prices' r = session.get(url, headers=headers) # 延长渲染等待时间至3秒,确保JS加载完成 r.html.render(sleep=3) soup = BeautifulSoup(r.html.html, 'html.parser') # 改用包含匹配的方式查找表格,容错性更高 table = soup.find('table', class_=lambda x: x and 'fundtable' in x) if not table: print("未找到目标表格,请检查网络或站点是否有更新") else: # 遍历表格行提取匹配数据 for row in table.find('tbody').find_all('tr'): cols = [col.get_text(strip=True) for col in row.find_all('td')] if not cols: continue fund_name = cols[0] # 匹配基金名称或缩写 if any(target in fund_name for target in target_funds): print(cols)
额外优化提示
- 如果站点渲染速度较慢,可以适当调高
sleep参数的数值,比如设为5 - 提取到的匹配数据可以直接写入csv或json文件存储,不需要额外做格式转换
- 如果后续站点更新了表格class,只需要修改
find方法里的class匹配规则即可
内容的提问来源于stack exchange,提问作者user1897151
相关产品推荐
相关产品推荐

