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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 20:06:02