如何从Pandas DataFrame提取并自动下载CVE网站的Raw列链接?
解决方案
pd.read_html()仅提取表格文本内容,无法保留HTML元素的属性(如链接的href),因此需要通过Selenium直接定位表格内的链接元素获取真实下载地址,再实现自动下载功能。
修改后的完整代码
import pandas as pd from selenium import webdriver from selenium.webdriver.common.by import By import requests import os # 初始化Safari浏览器(可替换为Chrome/Firefox等) browser = webdriver.Safari() browser.get("https://www.cve.org/downloads") # 获取表格所有行元素 table_rows = browser.find_elements(By.CSS_SELECTOR, "table tr") # 初始化存储数据的列表 data_list = [] # 跳过表头行,遍历数据行 for row in table_rows[1:]: cols = row.find_elements(By.TAG_NAME, "td") # 提取各列文本内容 format_type = cols[0].text.strip() unix_compressed = cols[1].text.strip() gzipped = cols[2].text.strip() # 提取Raw列的文本和对应链接 raw_col = cols[3] raw_text = raw_col.text.strip() raw_download_link = raw_col.find_element(By.TAG_NAME, "a").get_attribute("href") # 处理备注列(避免索引越界) notes = cols[4].text.strip() if len(cols) > 4 else "" # 将当前行数据存入列表 data_list.append({ "Format": format_type, "Unix Compressed (.Z)": unix_compressed, "Gzipped": gzipped, "Raw Text": raw_text, "Raw Download Link": raw_download_link, "Additional Notes": notes }) # 转换为DataFrame df = pd.DataFrame(data_list) print(df) # 自动下载Raw列的所有文件 download_directory = "./cve_downloads" os.makedirs(download_directory, exist_ok=True) for _, row in df.iterrows(): download_url = row["Raw Download Link"] filename = download_url.split("/")[-1] save_path = os.path.join(download_directory, filename) # 使用requests下载文件(避免Selenium弹窗问题) response = requests.get(download_url, stream=True) with open(save_path, "wb") as file: for chunk in response.iter_content(chunk_size=1024): file.write(chunk) print(f"已完成下载: {filename}") # 关闭浏览器 browser.quit()
核心调整说明
- 直接通过Selenium定位表格内的
<a>标签,调用get_attribute("href")获取真实下载链接 - 采用
requests库下载文件,比Selenium模拟点击更高效,同时规避浏览器下载弹窗干扰 - 自动创建下载目录,避免路径不存在导致的错误
内容的提问来源于stack exchange,提问作者Isaac Agatep
相关产品推荐
相关产品推荐

