【问题标题】:How do I get just the sitename from url in ruby?如何从 ruby​​ 中的 url 获取站点名称?
【发布时间】:2013-03-03 09:54:30
【问题描述】:

我有一个网址,例如:

http://www.relevantmagazine.com/life/relationship/blog/23317-pursuing-singleness 

并且想从中提取相关杂志。

目前我有:

@urlroot = URI.parse(@link.url).host

但它返回 www.relevantmagazine.com 谁能帮助我?

【问题讨论】:

    标签: ruby parsing url


    【解决方案1】:

    为此使用 gem 可能有点矫枉过正,但无论如何:有一个名为 domainatrix 的方便 gem,可以在处理两个元素顶级域等事务时为您提取站点名称。

    url = Domainatrix.parse("http://www.pauldix.net")
    url.url       # => "http://www.pauldix.net" (the original url)
    url.public_suffix       # => "net"
    url.domain    # => "pauldix"
    url.canonical # => "net.pauldix"
    
    url = Domainatrix.parse("http://foo.bar.pauldix.co.uk/asdf.html?q=arg")
    url.public_suffix       # => "co.uk"
    url.domain    # => "pauldix"
    url.subdomain # => "foo.bar"
    url.path      # => "/asdf.html?q=arg"
    url.canonical # => "uk.co.pauldix.bar.foo/asdf.html?q=arg"
    

    【讨论】:

    • 感谢您的回答,这有点矫枉过正,但将来可能会有用
    • 看起来确实如此,直到您想解析pilot.consulting.aero 才意识到consulting.aero 是顶级域。 :-D
    • 你需要矫枉过正......域很复杂......你需要一个包含每个已知 tld 的库,这样你就知道所有可能出现在你的“域”之前的东西,它不可能弄清楚有多少实体出现在您的域之前.. 但您知道您总是距离您的 tld 仅一两步..
    【解决方案2】:

    怎么样

    @urlroot = URI.parse(@link.url).host.gsub("www.", "").split(".")[0]

    【讨论】:

    • 谢谢,但这并没有从最后删除 .com、.co.uk 等。
    • 我错过了这个要求
    • fixed ish..... 如果你有 www.blah.goo.arch.boom.myactualdomain.co.uk 你会需要一个超级强大的正则表达式......考虑到这些,如果您想变得超级疯狂,我会根据您的实际要求进行调整...您是否期​​望像这样超级疯狂的子域?
    • 这是真的,即使在我自己的回答中,我也会得到第一个子域,所以不能解决我想要的问题
    【解决方案3】:

    试试这个正则表达式:

    regex = %r{http://[w]*[\.]*[^/|$]*}
    

    如果您有以下 url 字符串,它会给出以下内容:

    url = 'http://www.google.com/?q=blah'
    url.scan(regex) => ["http://www.google.com"]
    
    url = 'http://google.com/?q=blah'
    url.scan(regex) => ["http://google.com"]
    
    url = 'http://google.com'
    url.scan(regex) => ["http://google.com"]
    
    url = 'http://foo.bar.pauldix.co.uk/asdf.html?q=arg'
    url.scan(regex) => ["http://foo.bar.pauldix.co.uk"]
    

    它并不完美,但它会删除除前缀和主机名之外的所有内容。然后,您可以使用其他代码轻松清理前缀,现在您只需在字符串的开头查找 http:// 或 http://www.。另一个想法是,如果你还要解析https://,你可能需要稍微调整一下我给你的正则表达式。我希望这可以帮助您入门!

    编辑:

    我重新阅读了这个问题,并意识到我的回答并没有真正满足您的要求。我想知道你是否知道你正在解析的网址是否有一个固定的格式可能会有所帮助,就像总是有 www。如果是这样,您可以使用正则表达式来提取 url 中第一个和第二个句点之间的所有内容。如果没有,也许您可​​以调整我的正则表达式,使其成为 / 或 www 之间的所有内容。和第一期。这可能是仅获取没有 www 的站点名称的最简单方法。或 .com 或 .au.uk 等。

    修改正则表达式:

    regex = %r{http://[w]*[\.]*[^\.]*}
    url = 'http://foo.bar.pauldix.co.uk/asdf.html?q=arg'
    url.scan(regex) => ["http://foo"]
    

    这会很奇怪。如果您使用正则表达式的东西,您可能必须逐步清理 url 以提取您想要的部分。

    【讨论】:

      【解决方案4】:

      也许你可以把它分开?

       URI.parse(@link.url).host.split('.')[1]
      

      请注意,某些注册域名可能包含多个注册国家/地区域名的组成部分,例如 .co.uk 或 .co.jp 或 .com.au。

      【讨论】:

      • 您的回答还假定 URL 包含主机名。
      • 是的,如果网址像 relevantmagazine.com/life/relationship/blog/… 那样出现,那将无法正常工作,因为我会返回 relevantmagazine.com
      • 相对链接也会有问题,比如/example而不是http://example.com/example。
      • @tadman 会是,但在我的用例中,我只会处理绝对链接。
      【解决方案5】:

      我发现答案的灵感来自 tadman 的回答和the answer in another question

      @urlroot = URI.parse(item.url).host
      @urlroot = @urlroot.start_with?('www.') ? @urlroot[4..-1] : @urlroot
      @urlroot = @urlroot.split('.')[0]
      

      第一行获取主机,第二行获取删除 www。如果它们是第一行和第三行,则在下一个点之前获取所有内容。

      【讨论】:

      • 这仍然没有回答,正如另一个答案中的评论指出的那样 - 如果链接是 subdomain.domain.com 我会得到子域而不是域部分。
      猜你喜欢
      • 2012-12-20
      • 1970-01-01
      • 2019-07-13
      • 2018-06-26
      • 2016-05-13
      • 1970-01-01
      • 2010-12-11
      • 1970-01-01
      • 2014-02-09
      相关资源
      最近更新 更多