2013-04-18 57 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」或其「搜索」。 –

相關問題