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

如何用Python为Selenium下载的PDF文件添加原下载URL至文件名

Selenium下载PDF后按原URL重命名文件

要实现下载PDF后将文件名包含原URL的需求,需要解决两个核心问题:定位刚下载的文件和处理URL中的非法文件名字符。以下是修改后的完整代码:

import os
import time
import glob
from selenium import webdriver

folderName = input("Enter The FolderName:\t").upper()
newDir = "C:\\Users\\sulta\\Data Science CV\\" + folderName
print(newDir)

if not os.path.exists(newDir):
    os.makedirs(newDir)

# 配置Chrome下载选项
options = webdriver.ChromeOptions()
options.add_experimental_option('prefs', {
    "download.default_directory": newDir,
    "download.prompt_for_download": False,
    "download.directory_upgrade": True,
    "plugins.always_open_pdf_externally": True
})

driver = webdriver.Chrome(options=options)

# 处理URL中的非法文件名字符
def sanitize_filename(url):
    # 替换Windows文件名禁止的字符为下划线
    invalid_chars = '<>:"/\\|?*'
    for char in invalid_chars:
        url = url.replace(char, '_')
    # 限制文件名长度(Windows最大255字符)
    return url[:200] + ".pdf"  # 保留后缀,避免过长

# 获取下载目录中最新的文件
def get_latest_file(dir_path):
    # 遍历目录下所有文件,按修改时间排序
    files = glob.glob(os.path.join(dir_path, "*"))
    if not files:
        return None
    return max(files, key=os.path.getctime)

for current_link in link:  # 直接遍历link列表更简洁
    try:
        # 记录下载前的文件列表,避免误判
        pre_download_files = set(glob.glob(os.path.join(newDir, "*")))
        
        driver.get(current_link)
        driver.set_page_load_timeout(10)
        
        # 等待文件下载完成(最多等待15秒,可根据实际调整)
        wait_time = 0
        while wait_time < 15:
            post_download_files = set(glob.glob(os.path.join(newDir, "*")))
            new_files = post_download_files - pre_download_files
            if new_files:
                break
            time.sleep(1)
            wait_time += 1
        
        if not new_files:
            print(f"下载超时或未找到文件: {current_link}")
            continue
        
        # 获取最新下载的文件
        latest_file = get_latest_file(newDir)
        # 生成新文件名
        new_filename = sanitize_filename(current_link)
        new_file_path = os.path.join(newDir, new_filename)
        
        # 重命名文件(处理可能的重名,添加序号)
        counter = 1
        while os.path.exists(new_file_path):
            new_filename = f"{sanitize_filename(current_link)[:-4]}_{counter}.pdf"
            new_file_path = os.path.join(newDir, new_filename)
            counter += 1
        
        os.rename(latest_file, new_file_path)
        print(f"文件已重命名: {new_filename}")
        
    except Exception as e:
        print(f"处理链接出错: {current_link}, 错误信息: {str(e)}")
        continue

driver.quit()

关键说明:

  • 非法字符处理:sanitize_filename函数会把URL中Windows禁止的文件名字符替换为下划线,同时限制长度避免超出系统限制。
  • 下载等待逻辑:通过对比下载前后的文件列表,确保文件完成下载后再进行重命名,避免因文件未完全写入导致的错误。
  • 重名处理:如果多个链接处理后文件名重复,会自动添加序号区分。
  • 遍历优化:直接遍历link列表比用range(len(link))更简洁易读。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 14:35:22