2012-07-10 53 views
0

我必須刮掉一個網站並將所有頁面保存爲HTML並將其完全放在DVD上。我已經完成了這個工作,但是現在所有的鏈接都以/開頭,並且抓取了我的根目錄。我想將所有文件(1500頁)的所有href更改爲href="./",因此它總是抓取工作目錄。將所有hrefs更改爲工作目錄

我看到的東西有關bashsed,但我沒聽太明白如何動態地抓住所有href S和改變他們。

我怎樣才能以有效的方式做到這一點?

+0

你如何刮網站?如果你使用'wget'(這對鏡像/抓取非常好,IMO),你可以傳遞'-k'標誌來使鏈接指向本地文件。 – 2012-07-10 12:09:08

+0

'-k'標誌不會改變有關超鏈接的任何內容。剛剛嘗試過。或者它是否替換下載後的鏈接? – tolgap 2012-07-10 12:23:41

+0

是的,它會在完成下載後取代鏈接。它也將轉換樣式表內的鏈接,鏈接到圖像和其他媒體等。 – 2012-07-10 12:34:50

回答

1

正如我在我的評論說以上,這取決於工具,你」重新使用刮擦網站,你可以開始檢查它是​​否支持重寫鏈接。 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更高級的程序,它缺少正確轉換鏈接所需的上下文。

+0

下載所有文件需要很長時間。如果它已經完成並且有效,我會接受你的回答。 – tolgap 2012-07-10 12:47:43

+0

它仍在運行嗎?我很着迷知道它是否工作,或不... =) – 2012-07-10 17:37:35

0

您是否嘗試過使用base tag

+0

同樣的事情,我不完全理解的部分是將用於解決這個問題的'sed'表達式。 – tolgap 2012-07-10 11:59:30

+1

請不要鏈接到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

+0

我**完全**同意你的說法,對不起。 – 2012-07-10 12:28:35

0

嘗試這樣的事情,正則表達式可能不是100%,因此對其進行測試,在1個或2個文件,並相應調整:

find . -name "*.html" -exec sed -i 's|href="[^"]/|href="./|g' '{}' \; 
+0

我很抱歉,但這並沒有改變我的任何文件中的任何內容。 – tolgap 2012-07-10 12:10:51