如何使用Python解码HTTrack生成的编码图片URL?
解决HTTrack下载网站后图片cid格式URL的解码问题
问题场景
使用HTTrack Website Copier下载完整网站后,提取图片src属性得到的是以下特殊格式的内容:
cid:httpsX3aX2fX2fcommonsX2emX2ewikimediaX2eorgX2fstaticX2fimagesX2fmobileX2fcopyrightX2fcommonswikiX2dwordmarkX2esvg cid:httpsX3aX2fX2fuploadX2ewikimediaX2eorgX2fwikipediaX2fcommonsX2fthumbX2f6X2f6eX2fBursitisX5fElbowX5fWCX2eJPGX2f800pxX2dBursitisX5fElbowX5fWCX2eJPGX3f20070925222131 cid:httpsX3aX2fX2fuploadX2ewikimediaX2eorgX2fwikipediaX2fcommonsX2fthumbX2f6X2f62X2fPDX2diconX2esvgX2f64pxX2dPDX2diconX2esvgX2epng cid:httpsX3aX2fX2fuploadX2ewikimediaX2eorgX2fwikipediaX2fcommonsX2fthumbX2f6X2f6eX2fBursitisX5fElbowX5fWCX2eJPGX2f120pxX2dBursitisX5fElbowX5fWCX2eJPGX3f20070925222131
尝试urllib.parse.unquote等常规URL解码方法无效,需要将这类格式转换为正常明文URL。
格式分析
这类字符串的规则是:
- 前缀为
cid:,需要先移除 - URL中的特殊字符被替换为
X加对应ASCII码的十六进制值(例如X3a对应:,X2f对应/,X2e对应.,X5f对应_)
解决方案代码
使用Python正则表达式匹配并替换编码部分,实现解码:
import re def decode_cid_url(cid_str): # 移除开头的cid:前缀 url_content = cid_str.lstrip('cid:') # 匹配X+两位十六进制字符,转换为对应ASCII字符 decoded_url = re.sub(r'X([0-9a-fA-F]{2})', lambda match: chr(int(match.group(1), 16)), url_content) return decoded_url # 测试示例 sample_urls = [ "cid:httpsX3aX2fX2fcommonsX2emX2ewikimediaX2eorgX2fstaticX2fimagesX2fmobileX2fcopyrightX2fcommonswikiX2dwordmarkX2esvg", "cid:httpsX3aX2fX2fuploadX2ewikimediaX2eorgX2fwikipediaX2fcommonsX2fthumbX2f6X2f6eX2fBursitisX5fElbowX5fWCX2eJPGX2f800pxX2dBursitisX5fElbowX5fWCX2eJPGX3f20070925222131" ] for url in sample_urls: print(decode_cid_url(url))
执行结果
运行上述代码后,会输出正常的明文URL:
https://commons.m.wikimedia.org/static/images/mobile/copyright/commonswiki/wordmark.svg https://upload.wikimedia.org/wikipedia/commons/thumb/6/6e/Bursitis_Elbow_WC.JPG/800px-Bursitis_Elbow_WC.JPG?20070925222131
内容的提问来源于stack exchange,提问作者YoYoYo
相关产品推荐
相关产品推荐

