2015-09-17 151 views
1

我正在製作一個網絡爬蟲,並試圖找出一種方法從相對路徑找出絕對路徑。 我參加了2個考點。一個在ROR中,另一個在Pyro CMS中製作。從相對路徑解析絕​​對路徑

在後者中,我找到了鏈接爲「index.php」的href標籤。所以,如果我目前正在抓取http://example.com/xyz,那麼我的抓取工具會追加並製作它http://example.com/xyz/index.php。但問題是,我應該追加到根,即應該是http://example.com/index.php。所以如果我抓取http://example.com/xyz/index.php,我會發現另一個「index.php」,它會被再次追加。

在ROR中,如果相對路徑以'/'開始,我可以很容易地知道它是一個根站點。

我可以處理index.php的情況,但可能有這麼多的規則,我需要照顧,如果我開始做手動。我相信有一個更簡單的方法來完成這件事。

+0

並非像您所假設的那樣是一項任務。隨意從[這裏](https://github.com/cgray/geronimo/blob/master/src/Geronimo/UrlResolver.php)中汲取靈感。 – Orangepill

+0

使用'(* URL).Parse'(請參閱http://golang.org/pkg/net/url/#URL.Parse),它正是你想要的(如果它們是實際的,語義上正確的,正確的鏈接沒有CMS習慣廢話)。 – Volker

回答

1

在Go中,包path是你的朋友。

您可以從path.Dir()的路徑中獲取目錄或文件夾,例如,

p := "/xyz/index.php" 
dir := path.Dir(p) 
fmt.Println("dir:", dir) // Output: "/xyz" 

如果您發現與根路徑的鏈接(以斜槓開始),則可以按原樣使用該鏈接。

如果是相對的,您可以使用path.Join()加上dirJoin()也將「乾淨」的網址:

p2 := path.Join(dir, "index.php") 
fmt.Println("p2:", p2) 
p3 := path.Join(dir, "./index.php") 
fmt.Println("p3:", p3) 
p4 := path.Join(dir, "../index.php") 
fmt.Println("p4:", p4) 

輸出:

p2: /xyz/index.php 
p3: /xyz/index.php 
p4: /index.php 

通過path.Join()進行「清理」任務由path.Clean()做,你可以手動當然任何路徑上調用。它們是:

  1. 用單斜槓替換多個斜線。
  2. 消除每個.路徑名稱元素(當前目錄)。
  3. 消除每個內部路徑名稱元素(父目錄)以及其之前的非..元素。
  4. 消除..開始根路徑的元素:即,在路徑開始處將"/.."替換爲"/"

如果你有一個「完整」的網址(與架構,主機等),你可以使用url.Parse()函數從該標記化URL爲你的原始URL字符串獲得url.URL值,這樣你就可以得到這樣的路徑:

uraw := "http://example.com/xyz/index.php" 
u, err := url.Parse(uraw) 
if err != nil { 
    fmt.Println("Invalid url:", err) 
} 
fmt.Println("Path:", u.Path) 

輸出:

Path: /xyz/index.php 

嘗試在Go Playground所有例子。