题
对于Windows和Linux,我有 GNU Wget 1.10.2 , -k 选项在这两个选项上表现不同。
-k, - convert-links使下载的HTML中的链接指向本地文件。
在Windows上它会产生:
www.example.com/index.html www.example.com/index.html@page=about www.example.com/index.html@page=contact www.example.com/index.html@page=sitemap
并在linux上产生:
www.example.com/index.html www.example.com/index.html?page=about www.example.com/index.html?page=contact www.example.com/index.html?page=sitemap
这在linux中是有问题的,因为当我通过Apache服务镜像时,它不会区分4个生成的页面,因为在questionmark(?)字符之后的部分被用作查询字符串文件。
关于如何控制这个问题的任何想法?
感谢
解决方案
您不能在NTFS或FAT32上的文件名中使用问号(?)。这就是wget使用at符号(@)的原因。
在Linux中,大多数文件系统上只禁止使用斜杠(/),因此wget使用问号(因为它是URI的一部分)。
您可以使用--restrict-file-names=unix
或--restrict-file-names=windows
强制执行任何行为。
来自wget文档:
当模式设置为<!>#8220; unix <!>#8221;时,Wget 逃脱角色<!>#8216; / <!>#8217;和 控制范围0 <!>#8211; 31中的字符 和128 <!>#8211; 159。这是默认设置 类Unix操作系统。
当模式设置为<!>#8220; windows <!>#8221;,Wget 转义字符<!>#8216; \ <!>#8217;,<!>#8216; | <!>#8217;,<!>#8216; / <!>#8217;, <!>#8216;:<!>#8217;,<!>#8216;?<!>#8217;,<!>#8216; <!>“; <!>#8217;,<!># 8216; * <!>#8217;,<!>#8216; <!> lt; <!>#8217;,<!>#8216; <!> gt; <!>#8217;和 控制范围0 <!>#8211; 31中的字符 和128 <!>#8211; 159。除此之外,Wget 在Windows模式下使用<!>#8216; + <!>#8217;代替 #8216 <!>;:<!>#8217;在本地分离主机和端口 文件名,并使用<!>#8216; @ <!>#8217;代替 #8216 <!>; <>!#8217;分开查询部分 其余的文件名。 因此,将保存一个URL 如 #8216 <!>; <!>
www.xemacs.org:4300/search.pl?input=blah
#8217; 在Unix模式下将保存为 #8216 <!>; <!>www.xemacs.org+4300/search.pl@input=blah
#8217; 在Windows模式下。这种模式是 在Windows上默认。
其他提示
这在linux中存在问题,因为当我通过Apache服务镜像时,它不会区分4个生成的页面,因为在使用questionmark(?)字符作为文件的查询字符串之后的部分。
要在URL路径部分中包含问号,您可以将其转义:
www.example.com/index.html%3Fpage=about
- 转换链接应该为你做这个,我想<!>#8201; <!>#8212; <!>#8201;如果没有,可能是个bug。
这在linux中是有问题的,因为当我通过镜像服务时 Apache它不会区分4个生成的页面 在使用questionmark(?)字符作为查询字符串之后的部分 到文件。
如果已经很晚了,这个sed命令帮助了我:
find . -type f -name "*html*" -exec sed -i -r 's/(src|href)=(["\x27])(.*?)(\?)(.*?)\2/\1=\2\3%3F\5\2/g' {} +
它取代了吗?在href =或src =带有%3F的标签。 (\ x27是单勾)