2012-02-21 250 views
0

我有以下幾點:如何將字符串與數組元素進行匹配?

titles = [] 
url = [] 

titles.each do |link| 
    if link[:href] =~ 'http://www.google.com' 
    url.push(link[:href]) 
    end 
end 

,但我一直得到一個類型錯誤:

TypeError: type mismatch: String given 

附:我正在嘗試使用Nokogiri來解析從特定URL返回的鏈接。如果任何人有任何鏈接,除了Nokogiri教程/ wiki,關於如何最好地做到這一點,請讓我知道。

+0

爲什麼你有一個實際上包含'link'實體的變量'titles'? – 2012-02-21 18:08:25

+0

這有什麼不同?這與我正在試圖用腳本做什麼有關。這是一個商業邏輯決策。 – marcamillion 2012-02-21 18:16:23

+1

我想知道如何在你的postscript中解決這個問題。一般來說,從文檔中提取鏈接是'doc.find('// a [href]')',但不能進一步瞭解這些包含href的標題。 – 2012-02-21 18:30:49

回答

1

=~運算符用於匹配正則表達式,而不是字符串。

Match—If obj is a Regexp, use it as a pattern to match against str,and returns the position the match starts, or nil if there is no match. Otherwise, invokes obj.=~, passing str as an argument. The default =~ in Object returns nil.

http://ruby-doc.org/core-1.9.3/String.html#method-i-3D-7E

這會工作,假設你要檢查是否http://www.google.com包含在字符串中

titles = [] 
url = [] 

titles.each do |link| 
    if link[:href] =~ /http:\/\/www.google.com/ 
     url.push(link[:href]) 
    end 
end 
0

=~用於查找是否有針對字符串正則表達式匹配。如果匹配,則返回匹配的索引,否則返回對象。

在你的下面的語句中都是字符串,因此是錯誤。

link[:href] =~ 'http://www.google.com' 

應該是這樣的

link[:href] =~ /http:\/\/www.google.com/ 
+0

小心。上述正則表達式不起作用。你需要將'\/\ /'而不是'//''' – 2012-02-21 18:05:04

+0

這兩個斜槓轉義出來,謝謝@KassymDorsel,更新了相同的內容。 – nkm 2012-02-21 18:11:20

2

I am trying to use Nokogiri to parse the links returned from a particular URL.

雖然引入nokogiri很容易,甚至還有更簡單的方法。 Ruby的內置URI有URI.extract方法。從文檔:

Extracts URIs from a string. If block given, iterates through all matched URIs. Returns nil if block given or array with matches. Usage

require "uri" 

URI.extract("text here http://foo.example.org/bla and here mailto:[email protected] and here also.") 
# => ["http://foo.example.com/bla", "mailto:[email protected]"] 

你可以告訴它使用什麼方案,所以將只檢索HTTP或HTTPS或任何你正在尋找。

+0

我喜歡這個建議,不同之處在於我不希望給定鏈接中的URI。我想要鏈接的文本 - 錨標籤也。根據URI.extract的文檔,它似乎只管理URL,而不是它周圍的任何元素......如果這是有道理的。 – marcamillion 2012-02-21 19:27:07

+0

它只返回頁面中與URL正則表達式匹配的值。它不像Nokogiri那樣做任何標籤解析。因此,它可以檢索URI,但對於周圍的標籤或內容並不好。根據你的問題,這就是你想要的。 – 2012-02-21 22:03:58

1

從後續評論看,你真的想搜索所有鏈接的文本部分,這絕對是可以用Nokogiri完成的事情。實際上,它可以通過一個XPath表達式來完成!

urls = doc.xpath("//a[contains(text(), '#{search_term}')]/@href") 

其中search_term包含您正在查找的字符串。

可以對其進行修改以使其不區分大小寫。不幸的是,Nokogiri使用XPath 1.0,所以方便的XPath 2.0函數lower-case()不可用。有一個解決方法:使用translate()

upper = ("A".."Z").to_a.join 
lower = ("a".."z").to_a.join 
urls = doc.xpath("//a[contains(translate(.,'#{upper}','#{lower}'), '#{search_term.downcase}')]/@href") 
+0

感謝您的支持。你有鏈接,我可以瞭解更多關於xpath?我翻看了Nokogiri的文檔 - 這裏是:http://nokogiri.org/tutorials/searching_a_xml_html_document.html - 我找到了一篇關於xpath的「章節」的章節,但我找不到那章。它表示:「您可以使用任何您喜歡的XPath或CSS查詢(請參閱關於XPath和CSS語法的章節以獲取更多信息)''。我在哪裏可以獲得更多信息? – marcamillion 2012-02-23 17:36:41

+0

順便說一句,'@ href'包含什麼?初始化的位置在哪裏?它無關緊要嗎? – marcamillion 2012-02-23 17:39:01

+0

網絡上有許多XPath教程。我強烈建議學習XPath;它們就像XML/HTML的正則表達式一樣。爲了回答你的另一個問題,「@ href」指的是一個「href」屬性節點,它被認爲是元素的子節點(在本例中爲'a')。 '[]'括號稱爲謂詞,它幫助我將它們視爲修改元素的「這樣的」條件。 – 2012-02-23 23:14:35

相關問題