【问题标题】:Resolving absolute path from relative path从相对路径解析绝​​对路径
【发布时间】:2015-09-17 00:38:35
【问题描述】:

我正在制作一个网络爬虫,我正在尝试找出一种从相对路径中找出绝对路径的方法。 我拿了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 的情况,但是如果我开始手动操作,可能需要注意很多规则。我确信有一种更简单的方法可以完成这项工作。

【问题讨论】:

  • 不像你想象的那样微不足道的任务。随意从here 汲取灵感。
  • 使用(*URL).Parse(参见golang.org/pkg/net/url/#URL.Parse),它完全符合您的要求(如果这些是实际的、语义正确的、正确的链接,没有CMS 自定义废话)。

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


【解决方案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() 完成,当然您可以在任何路径上手动调用。它们是:

  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 上的所有示例。

【讨论】:

    猜你喜欢
    • 2010-12-11
    • 2010-10-03
    • 2011-06-30
    • 1970-01-01
    • 1970-01-01
    • 2017-04-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多