为什么Wget递归下载网站时会修改HTML中JS代码的字符编码?
问题根因
该问题由Wget的--convert-links参数的过度处理逻辑导致:Wget的链接转换功能会扫描页面所有内容中符合URL特征的片段,哪怕是位于JS代码的字符串拼接场景中,也会强制将相对路径补全为绝对路径,同时对拼接用的空格、+符号做HTML实体转义,最终破坏原有JS代码逻辑。
你之前尝试的编码、文件名限制类参数均无效,因为该问题是Wget链接转换逻辑的主动修改行为,和编码解析、文件名转义无关。另外Excel链接被优先识别是因为Wget扫描时会优先匹配常见静态资源后缀(包括.xls),因此这类拼接的Excel链接更容易被误处理。
解决方案
方案1:移除--convert-links参数(最简便)
如果不需要下载后离线打开所有站内链接,直接删除命令中的--convert-links参数即可完全避免JS代码被修改,调整后的命令如下:
data_dir="test_data" mkdir $data_dir urls="https://aarsrapport.smn.no/2020/" wget --recursive --level=inf --page-requisites --adjust-extension --no-parent --restrict-file-names=ascii --remote-encoding=utf-8 --directory-prefix="$data_dir" $urls
方案2:保留离线浏览能力的两步处理法
如果需要保留链接转换功能方便离线浏览,可以分两步执行:
- 先不带
--convert-links参数执行递归下载,保证所有原始文件内容完整 - 下载完成后,用sed工具批量修复所有HTML文件中被转义的JS拼接代码:
find $data_dir -name "*.html" -exec sed -i 's/ + / + /g' {} \;
如果还有其他转义字符被误转换,可以对应补充sed替换规则即可。
内容的提问来源于stack exchange,提问作者Magnuti
相关产品推荐
相关产品推荐

