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

如何用Python提取网页JavaScript脚本dTree内的CSV下载链接

解决办法

BeautifulSoup仅支持HTML结构解析,无法直接读取JavaScript运行时的对象属性,你可以通过正则匹配提取JS代码中的CSV链接,实现流程如下:

  • 第一步:从页面中提取包含dTree声明的<script>标签文本内容
  • 第二步:用正则匹配所有d.add语句中后缀为.csv的资源相对路径
  • 第三步:将相对路径拼接站点主域名,得到完整的CSV下载地址
  • 第四步:遍历地址列表完成批量下载

完整可运行代码示例

import re
import requests
from bs4 import BeautifulSoup
import os

# 基础配置
base_url = "http://meteo.navarra.es"
target_page = "http://meteo.navarra.es/estaciones/descargardatos_estacion.cfm?IDEstacion=251"
save_dir = "./navarra_csv"
os.makedirs(save_dir, exist_ok=True)

# 请求页面
response = requests.get(target_page)
response.encoding = "utf-8"
soup = BeautifulSoup(response.text, "html.parser")

# 提取所有script标签内容,筛选包含d.add的脚本
script_content = ""
for script in soup.find_all("script"):
    if script.string and "d.add" in script.string:
        script_content = script.string
        break

# 正则匹配所有csv相对路径
# 正则规则:匹配d.add语句中第四个单引号包裹的、后缀为.csv的内容
csv_pattern = r"d\.add\(\d+,\d+,'[^']+\.csv','([^']+)'\)"
csv_paths = re.findall(csv_pattern, script_content)

# 批量下载
for path in csv_paths:
    full_url = base_url + path
    file_name = path.split("/")[-1]
    file_path = os.path.join(save_dir, file_name)
    
    csv_resp = requests.get(full_url)
    with open(file_path, "wb") as f:
        f.write(csv_resp.content)
    print(f"已下载:{file_name}")

可选方案

如果后续页面JS结构变动较大,正则匹配维护成本高,可以引入PyExecJS库直接运行提取到的JS代码,拿到dTree实例后遍历属性获取链接,该方案更适配JS逻辑复杂的场景,但需要额外安装依赖且运行效率更低。

内容的提问来源于stack exchange,提问作者aarribas12

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 16:45:03