1
4

2 回答 2

4

当你处理 URL 时,你应该从 URI 开始,然后,为了弄乱路径,切换到使用File.dirname和/或File.basename

require 'uri'
uri = URI.parse('http://www.yadaya.com/nyc/sales/manhattan')
dir = File.dirname(uri.path).split('/').last

设置dir"sales".

不需要正则表达式,除了在内部做什么parsesplit做什么。

在代码的上下文中使用它:

File.dirname(URI.parse(listings.css('a').text).path).split('/').last

但是,就个人而言,为了清晰和可读性,我会将其分成两行,这意味着更容易维护。

一个警告虽然:

listings.css('a')

返回一个类似于数组的 NodeSet。如果您正在搜索的 DOM 有多个<a>标签,您将获得多个 Node 传递给text,然后将其连接到您视为 URL 的文本中。这是等待中的一个错误:

require 'nokogiri'

html = '<div><a href="foo">foo</a><a href="bar">bar</a></div>'
doc = Nokogiri::HTML(html)

doc.at('div').css('a').text

结果是:

"foobar"

相反,您的代码需要是:

listings.at('a')

或者

listings.at_css('a')

所以只返回一个节点。在我的示例代码的上下文中:

doc.at('div').at('a').text
# => "foo"

即使设置的代码listings仅导致单个<a>节点可见,也请使用atorat_css以确保正确性。

于 2013-04-21T04:43:09.127 回答
2

由于您有完整的 URL using ,您可以使用URIlistings.css('a').text类和正则表达式的组合解析出路径的一部分,使用如下所示:

require 'uri'

uri = URI.parse(listings.css('a').text)
 => #<URI::HTTP:0x007f91a39255b8 URL:http://www.yadaya.com/nyc/sales/manhattan>

match = %r{^/nyc/([^/]+)/}.match(uri.path)
 => #<MatchData "/nyc/sales/" 1:"sales">

match[1]
 => "sales"

您可能需要调整正则表达式以满足您的需要,但这就是要点。

于 2013-04-21T01:16:57.257 回答