Nokogiri-解析HTML <a href=""> and displaying only part of the URL</a>

时间:2013-04-21 00:53:26

标签: ruby-on-rails ruby nokogiri

所以基本上我正在抓一个网站,我想只显示部分地址。例如,如果它是www.yadaya.com/nyc/sales/manhattan,我想只将“sales”放在哈希或数组中。

{
  :listing_class => listings.css('a').text
}

这会给我整个网址。我想要gsub来获得部分输出吗?

谢谢!

2 个答案:

答案 0 :(得分:4)

当您处理网址时,您应该从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,类似于一个Array。如果您要搜索的DOM有多个<a>标记,则会将多个节点传递给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>节点可见,也请使用atat_css来确保正确性。

答案 1 :(得分:2)

由于您拥有使用listings.css('a').text的完整网址,因此您可以使用URI类和正则表达式的组合解析路径的一部分,使用以下内容:

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"

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