我必须抓一个网站并将所有页面保存为HTML并将其完全放在DVD上。我已经完成了这个,但是现在所有链接都以/
开头,并且抓取了我的根目录。我想将所有文件的所有href
(1500页)更改为href="./"
,以便它始终抓住工作目录。
我在sed
中看到了关于bash
的内容,但我并没有完全了解如何动态抓取所有href
并更改它们。
我怎么能以有效的方式做到这一点?
答案 0 :(得分:1)
正如我在上面的评论中所说,根据您用来刮取网站的工具,您可以先检查它是否支持重写链接。 wget
将通过传递-k
选项
-k, --convert-links make links in downloaded HTML or CSS point to
local files.
我认为UgoMéda的建议base
tag不会起作用,因为您的网址是绝对的,而基本标记只允许您指定相对网址的基础:
href = uri [CT]
This attribute specifies an absolute URI that acts as the base URI for resolving relative URIs.
要重写每个href
都很棘手,因为很难知道你做的是正确的事情 - 这取决于网站的结构。请考虑以下示例:
/foo/bar.html:
<a href="/bar/baz.html">baz</a>
如果根据您的建议重写,那将是:
<a href="./bar/baz.html">baz</a>
但这不起作用,因为当文件真正位于/foo/bar/baz.html
时,浏览器会将其解析为[SOME DIR]/bar/baz.html
。在这种情况下,你真的想要:
<a href="../bar/baz.html">baz</a>
我想说的是,正确(重写)的URL始终取决于当前文件的位置和目标文件的位置。总而言之,我认为您最好的选择是使用wget
或其他支持URL重写的工具,或者您需要一些比sed
更高级的程序,这些程序缺少正确转换链接所需的上下文
答案 1 :(得分:0)
您是否尝试使用base
tag?
答案 2 :(得分:0)
尝试这样的事情,正则表达式可能不是100%所以在1或2个文件上测试它并相应调整:
find . -name "*.html" -exec sed -i 's|href="[^"]/|href="./|g' '{}' \;