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