如何在Python中转换URL编码字符串?附PDF批量下载代码解析
在Python中处理URL编码字符串及优化PDF下载代码
嘿,我来帮你搞定Python里的URL编码转换,顺便优化下你的PDF下载代码~
一、URL编码与解码的常用方法
Python自带的urllib.parse模块就能轻松处理URL编码/解码,给你几个实用场景:
- 把普通字符串转成URL兼容格式:用
quote()或者quote_plus()。后者会把空格替换成+,更符合URL的标准规范from urllib.parse import quote, quote_plus # 示例:包含中文的文件名 original_name = "Python编程入门.pdf" # 基础编码 encoded_name = quote(original_name) # 结果: Python%E7%BC%96%E7%A8%8B%E5%85%A5%E9%97%A8.pdf # 适合URL的编码(空格转+) encoded_name_plus = quote_plus(original_name) # 结果: Python%E7%BC%96%E7%A8%8B%E5%85%A5%E9%97%A8.pdf(如果有空格会变成+) - 把URL编码的字符串转回原始内容:用
unquote()或者unquote_plus(),对应上面的编码方式from urllib.parse import unquote, unquote_plus encoded_name = "Python%E7%BC%96%E7%A8%8B%E5%85%A5%E9%97%A8.pdf" decoded_name = unquote(encoded_name) # 结果: Python编程入门.pdf
二、优化你的PDF下载代码
看你提供的代码,核心问题应该是文件名处理:如果pdfUrl里的文件名是URL编码后的(比如包含中文、空格这类特殊字符),直接用os.path.basename()拿到的会是一堆%xx的编码串,保存出来的文件名既不友好也可能乱码。我们可以先解码URL,再提取文件名。
改进后的代码如下:
import os import requests from urllib.parse import unquote for pdf in preTag: pdfUrl = "https://the-eye.eu/public/Books/Programming/" + pdf.get("href") print("Downloading...%s" % pdfUrl) # 发起请求并确保请求成功 page = requests.get(pdfUrl) page.raise_for_status() # 关键:先解码URL,再提取可读的文件名 decoded_url = unquote(pdfUrl) pdf_filename = os.path.basename(decoded_url) # 拼接保存路径,用上下文管理器自动关闭文件 save_path = os.path.join(filePath, pdf_filename) with open(save_path, "wb") as pdfFile: for chunk in page.iter_content(1000000): pdfFile.write(chunk) print(f"✅ 下载完成:{pdf_filename}")
几个小改进点:
- 用
unquote()解码后再取文件名,确保保存的是原始的可读名称(比如中文文件名不会变成编码后的乱码形式) - 改用
with open()上下文管理器,不用手动调用close(),避免忘记关闭文件导致的问题 - 增加了下载完成的提示,方便你跟踪下载进度
如果pdf.get("href")本身已经是编码后的字符串,你也可以先单独解码href再拼接URL,效果是一样的:
decoded_href = unquote(pdf.get("href")) pdfUrl = "https://the-eye.eu/public/Books/Programming/" + decoded_href
内容的提问来源于stack exchange,提问作者user9440272
相关产品推荐
相关产品推荐

