2013-04-18 24 views
0

我猜这对于Nokogiri有点经验的人来说是个小问题,但是我一直没能在我在网上找到的文档或教程中找到答案。如何选择具有未知值的给定属性的标签?

我有一个引入nokogiri文件是这样的:

page = Nokogiri::HTML(open("http://www.example.com")) 

和页面包含以下标签:

<a title="could be anything" href="http://www.example.com/foo"></a> 

我如何获得的href值如果title值是未知?

+3

但是你需要某些东西作为参考来获取'href'的值,如果你想提取任何特定的。或者如果你想要什么都不需要,那么有办法让所有人都获得。首先确认我。 –

+0

我想使用标题密钥作为参考。标题的价值是未知的。我认为这需要一个XPath解决方案,但我一直在使用CSS选择器。我可以使用这个: page.xpath('// a [@title]') 获得所有标题的值,但我不想要标题的值。我试图找到'href'的兄弟属性的值。 –

+1

所以你想选择所有具有'title'属性的'a'元素的'href'? –

回答

2

如果你想在href的价值对于具有title属性,你可以使用a元素属性引入nokogiri的xpath如下:

require 'nokogiri' 

doc = Nokogiri::HTML(File.open('sample.html')) 

a_with_title = doc.xpath('//a[@title]').map { |e| puts e['href'] } 

如果你想从一个URL选择网上你可以使用

require 'nokogiri' 
require 'open-uri' 

doc = Nokogiri::HTML(open('http://stackoverflow.com/')) 

a_with_title = doc.xpath('//a[@title]').map { |e| puts e['href'] } 
+0

这是我的项目的完美解决方案。谢谢! –

+1

使用'doc.xpath('// a [@title]')。map {| n | n ['href']}'。 –

+0

@theTinMan谢谢。我明白为什么要更简洁明了,但为什么'map'而不是'each'?这个问题暗示了吗?这个问题还不清楚。 –

1

我终于明白了。我相信,以下操作将从第一个链接元素中选择href,其标题属性为:page.css('a[title]')[0]['href']

我以为page.css('a[title]')选择title属性的值,但实际上它选择整个元素。然后您可以引用此元素以从中获取值。

+1

'page.at('a [title]')'是正确的使用方法;它和页面中的page.css('a [title]')[0]'具有相同的功能。 –

0
require 'nokogiri' 


doc = Nokogiri::HTML::DocumentFragment.parse <<-SCRIPT 
<a title="xx" href="http://www.example1.com/foo1"></a> 
<a title="aa" href="http://www.example2.com/foo2"></a> 
<a id=5 href="http://www.foo.com/foo3"></a> 
<a title="zz" href="http://www.example3.com/foo4"></a> 
<a id=5 href="http://www.test.com/foo5"></a> 
SCRIPT 

p doc.search("a").map { |nd| nd['href'] if nd.key?('title')}.compact 

#=> ["http://www.example1.com/foo1", "http://www.example2.com/foo2", "http://www.example3.com/foo4"] 
+0

您能否介绍一下代码的解释?它与其他解决方案相比如何? –

+0

@ N.N。好的!哪一部分让你感到困惑?告诉我,我会给你解释。这是做同样事情的另一种方式。 –

+0

所以它不是更有效或以其他方式更好?那么,我引用了Nokogiri的新内容,之前我从来没有见过“DocumentFragment”或其“搜索”。 –

相关问题