我必須刮掉一個網站並將所有頁面保存爲HTML並將其完全放在DVD上。我已經完成了這個工作,但是現在所有的鏈接都以/
開頭,並且抓取了我的根目錄。我想將所有文件(1500頁)的所有href
更改爲href="./"
,因此它總是抓取工作目錄。將所有hrefs更改爲工作目錄
我看到的東西有關bash
sed
,但我沒聽太明白如何動態地抓住所有href
S和改變他們。
我怎樣才能以有效的方式做到這一點?
我必須刮掉一個網站並將所有頁面保存爲HTML並將其完全放在DVD上。我已經完成了這個工作,但是現在所有的鏈接都以/
開頭,並且抓取了我的根目錄。我想將所有文件(1500頁)的所有href
更改爲href="./"
,因此它總是抓取工作目錄。將所有hrefs更改爲工作目錄
我看到的東西有關bash
sed
,但我沒聽太明白如何動態地抓住所有href
S和改變他們。
我怎樣才能以有效的方式做到這一點?
正如我在我的評論說以上,這取決於工具,你」重新使用刮擦網站,你可以開始檢查它是否支持重寫鏈接。 wget
會讓你做的正是這種通過傳遞-k
選項:
-k, --convert-links make links in downloaded HTML or CSS point to
local files.
我不認爲烏戈梅達的建議下,base
tag,將工作,因爲你的URL是絕對的,基本標籤只允許您指定基地相對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
更高級的程序,它缺少正確轉換鏈接所需的上下文。
下載所有文件需要很長時間。如果它已經完成並且有效,我會接受你的回答。 – tolgap 2012-07-10 12:47:43
它仍在運行嗎?我很着迷知道它是否工作,或不... =) – 2012-07-10 17:37:35
您是否嘗試過使用base
tag?
同樣的事情,我不完全理解的部分是將用於解決這個問題的'sed'表達式。 – tolgap 2012-07-10 11:59:30
請不要鏈接到W3Schools,嘗試更加有信譽的信息來源,如W3本身(***沒有***聯繫或與W3Schools的聯繫):http://www.w3.org/TR/ html-markup/base.html或Mozilla開發者網絡(MDN):https://developer.mozilla.org/en/HTML/Element/base – 2012-07-10 12:01:10
我**完全**同意你的說法,對不起。 – 2012-07-10 12:28:35
嘗試這樣的事情,正則表達式可能不是100%,因此對其進行測試,在1個或2個文件,並相應調整:
find . -name "*.html" -exec sed -i 's|href="[^"]/|href="./|g' '{}' \;
我很抱歉,但這並沒有改變我的任何文件中的任何內容。 – tolgap 2012-07-10 12:10:51
你如何刮網站?如果你使用'wget'(這對鏡像/抓取非常好,IMO),你可以傳遞'-k'標誌來使鏈接指向本地文件。 – 2012-07-10 12:09:08
'-k'標誌不會改變有關超鏈接的任何內容。剛剛嘗試過。或者它是否替換下載後的鏈接? – tolgap 2012-07-10 12:23:41
是的,它會在完成下載後取代鏈接。它也將轉換樣式表內的鏈接,鏈接到圖像和其他媒體等。 – 2012-07-10 12:34:50