0

我必须抓取一个网站并将所有页面保存为 HTML 并将其完全放在 DVD 上。我已经这样做了,但是现在所有的链接都以 开头/,并且抓住了我的根目录。我想将href所有文件(1500 页)的所有 s 更改为href="./"使其始终获取工作目录。

我见过关于sedin 的事情bash,但我不太了解如何动态抓取所有hrefs 并更改它们。

我怎样才能以有效的方式做到这一点?

4

3 回答 3

1

正如我在上面的评论中所说,根据您用来抓取网站的工具,您可以从检查它是否支持重写链接开始。将让你通过传递选项wget来做到这一点:-k

-k,  --convert-links      make links in downloaded HTML or CSS point to
                          local files.

我不认为 Ugo Méda 的建议basetag会起作用,因为您的 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缺少正确转换链接所需的上下文。

于 2012-07-10T12:31:16.303 回答
0

你试过使用base标签吗?

于 2012-07-10T11:58:22.427 回答
0

尝试这样的事情,正则表达式可能不是 100%,所以在 1 或 2 个文件上测试它并相应地调整:

find . -name "*.html" -exec sed -i 's|href="[^"]/|href="./|g' '{}' \;
于 2012-07-10T12:06:17.743 回答