2013-03-14 166 views
2

我有一个网址,如:如何从ruby中的url获取sitename?

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

,并想从中提取只是relevantmagazine

目前我有:

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

但它返回www.relevantmagazine.com任何人都可以帮我吗?

回答

5

为此使用宝石可能是矫枉过正,但无论如何:有一个方便的宝石名为domainatrix,可以在处理诸如两个元素顶级域等事物时为您提取sitename。

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" 
+0

谢谢你的回答,这对于这个有点矫枉过正,但在未来可能会有用 – 2013-03-14 21:18:59

+0

它肯定是这样,直到你想解析'pilot.consulting.aero'只是为了认识到'consulting.aero'是顶级域名。 :-D – 2013-03-14 21:21:44

+1

你需要矫枉过正...域名很复杂...你需要一个带有每个已知tld的图书馆,以便你知道在你的“域名”之前可能会出现的所有事情,而不可能找出有多少实体来在你的域名之前..但你知道你总是离开你的域名一到两步.. – 2013-03-14 21:29:47

0

也许你可以把它分开?

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

请记住,一些注册的域名可能有一个以上的组件来注册国家域名,像.co.uk.co.jp.com.au例如。

+2

你的回答也假定该URL包含一个主机名。 – 2013-03-14 20:38:19

+0

是的,这是行不通的,如果网址进来像 - http://relevantmagazine.com/life/relationship/blog/23317-pursuing-singleness,因为我会** relatedmagazine.com **返回 – 2013-03-14 21:10:22

+0

相关链接会也是有问题的,像'/ example'而不是'http:// example.com/example'。 – tadman 2013-03-15 02:06:03

0

我发现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。如果他们是第一和第三行,则在下一个点之前获取所有内容。

+0

这还没有回答,因为另一个答案中的评论指出 - 如果链接是http://子域名。 domain.com我会得到子域而不是域部分。 – 2013-03-14 21:29:33

1

如何约

@urlroot = URI.parse(@ link.url).host.gsub( “WWW”, “”).split( “”)[0]

+0

谢谢,但这并没有剥离.com,.co.uk等。 – 2013-03-14 21:21:56

+0

oo我错过了这个要求 – 2013-03-14 21:22:44

+1

修正了ish .....还是如果你有www.blah.goo.arch.boom.myactualdomain.co.uk你需要一个超级强大的正则表达式......这需要所有这些考虑到如果你想超级疯狂我会根据你的实际需求来设置它......你是否期望这样的超级疯狂子域名? – 2013-03-14 21:24:13

1

尝试正则表达式:

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。如果是这样,您可以使用正则表达式来提取网址中第一个和第二个时段之间的所有内容。如果没有,也许你可以调整我的正则表达式,以便它是/或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"] 

这将是不可思议。如果你使用正则表达式的东西,你可能不得不逐步做到清理网址来提取你想要的部分。