从相对路径解析绝对路径
我正在制作一个网络爬虫,我正试图找出一种方法来找出相对路径的绝对路径。 我带了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的情况,但如果我手动开始执行它,可能需要处理很多规则。 我确信有一种更简单的方法可以完成这项工作。
在Go中,包path
是你的朋友。
您可以从path.Dir()
的路径获取目录或文件夹,例如
p := "/xyz/index.php" dir := path.Dir(p) fmt.Println("dir:", dir) // Output: "/xyz"
如果找到具有根路径的链接(以斜杠开头),则可以按原样使用。
如果是相对的,可以使用path.Join()
将其与上面的dir
连接。 Join()
也会“清理”url:
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.Join()
完成,您可以在任何路径上手动调用它。 他们是:
- 用单个斜杠替换多个斜杠。
- 消除每一个
.
路径名元素(当前目录)。- 消除每个内部
..
路径名元素(父目录)以及它之前的非..
元素。- 消除开始根路径的元素:也就是说,在路径的开头用
"/"
替换"/.."
。
如果你有一个“完整”的url(有架构,主机等),你可以使用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上的所有例子。