我必须抓取一个网站并将所有页面保存为 HTML 并将其完全放在 DVD 上。我已经这样做了,但是现在所有的链接都以 开头/
,并且抓住了我的根目录。我想将href
所有文件(1500 页)的所有 s 更改为href="./"
使其始终获取工作目录。
我见过关于sed
in 的事情bash
,但我不太了解如何动态抓取所有href
s 并更改它们。
我怎样才能以有效的方式做到这一点?
正如我在上面的评论中所说,根据您用来抓取网站的工具,您可以从检查它是否支持重写链接开始。将让你通过传递选项wget
来做到这一点:-k
-k, --convert-links make links in downloaded HTML or CSS point to
local files.
我不认为 Ugo Méda 的建议base
tag会起作用,因为您的 URL 是绝对的,并且 base 标记只允许您为相对 URL 指定一个基础:
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
缺少正确转换链接所需的上下文。
你试过使用base
标签吗?
尝试这样的事情,正则表达式可能不是 100%,所以在 1 或 2 个文件上测试它并相应地调整:
find . -name "*.html" -exec sed -i 's|href="[^"]/|href="./|g' '{}' \;