从相对路径解析绝​​对路径

时间:2015-09-17 00:38:35

标签: php ruby-on-rails go web-crawler relative-path

我正在制作一个网络抓取工具,而我正试图找出一种方法来找出相对路径的绝对路径。 我带了2个测试站点。一个在ROR和一个使用Pyro CMS制作。

在后者中,我发现了带有链接" index.php"的href标签。因此,如果我目前正在http://example.com/xyz抓取,那么我的抓取工具会追加并将其设为http://example.com/xyz/index.php。但问题是,我应该追加到root,即它应该是http://example.com/index.php。因此,如果我抓取http://example.com/xyz/index.php,我会找到另一个" index.php"再次附加。

在ROR中,如果相对路径以' /'开头,我可以很容易地知道它是一个根网站。

我可以处理index.php的情况,但是如果我手动开始执行它,可能需要处理很多规则。我确信有更简单的方法来完成这项工作。

1 个答案:

答案 0 :(得分: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.   
  5. 消除每个内部..路径名称元素(父目录)以及其前面的非..元素。
  6.   
  7. 消除开始根路径的..个元素:也就是说,在路径的开头用"/.."替换"/"
  8.   

如果您有一个“完整”网址(包含架构,主机等),您可以使用url.Parse()函数从原始网址字符串中获取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上的所有示例。