如何用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
相关产品推荐
相关产品推荐

