我有以下内容:
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教程/维基,关于如何做到这一点,请告诉我。
答案 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/