如何将字符串与数组元素匹配?

时间:2012-02-21 17:58:41

标签: ruby nokogiri

我有以下内容:

titles = []
url = []

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

但我一直得到一个TypeError:

TypeError: type mismatch: String given

P.S。我试图使用Nokogiri来解析从特定URL返回的链接。如果有人有任何链接,除了Nokogiri教程/维基,关于如何做到这一点,请告诉我。

4 个答案:

答案 0 :(得分:2)

  

我正在尝试使用Nokogiri来解析从特定网址返回的链接。

虽然Nokogiri很容易,但还有更简单的方法。 Ruby的内置URI具有URI.extract方法。来自文档:

  

从字符串中提取URI。如果给定块,则遍历所有匹配的URI。如果给定块或具有匹配的数组,则返回nil。   使用

require "uri"

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

您可以告诉它使用哪些方案,因此它只会检索HTTP或HTTPS或您正在寻找的任何方案。

答案 1 :(得分:1)

=~运算符用于匹配Regexp,而不是字符串。

  

匹配 - 如果obj是Regexp,则将其用作匹配str的模式,和   返回匹配开始的位置,如果没有匹配则返回nil。   否则,调用obj。=〜,将str作为参数传递。默认=〜   在Object中返回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

答案 2 :(得分: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")

答案 3 :(得分:0)

=~用于查找是否存在与字符串匹配的正则表达式。如果匹配,则返回匹配的索引,否则返回 nil 对象。

在以下语句中,两者都是字符串,因此是错误。

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

它应该是这样的

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