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

我正在制作一个网络爬虫,我正试图找出一种方法来找出相对路径的绝对路径。 我带了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()完成,您可以在任何路径上手动调用它。 他们是:

  1. 用单个斜杠替换多个斜杠。
  2. 消除每一个. 路径名元素(当前目录)。
  3. 消除每个内部..路径名元素(父目录)以及它之前的非..元素。
  4. 消除开始根路径的元素:也就是说,在路径的开头用"/"替换"/.."

如果你有一个“完整”的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上的所有例子。

Interesting Posts