Nokogiri - 解析 HTML <一个 href>并仅显示 URL 的一部分



所以基本上我是抓取一个网站,我想只显示部分地址。例如,如果它是www.yadaya.com/nyc/sales/manhattan,我只想把"sales"放在散列或数组中。

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

会给我整个URL。我想要gsub来得到部分输出吗?

谢谢!

当您处理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,它类似于Array。如果您正在搜索的DOM有多个<a>标记,那么您将获得多个传递给text的Node,然后将其连接到作为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以确保正确性。

由于您使用listings.css('a').text获得了完整的URL,因此您可以使用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"

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

相关内容

  • 没有找到相关文章

最新更新