将所有href更改为工作目录

时间:2012-07-10 11:51:16

标签: php html regex hyperlink

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

我在sed中看到了关于bash的内容,但我并没有完全了解如何动态抓取所有href并更改它们。

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

3 个答案:

答案 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' '{}' \;