Ruby 如何使用正则表达式从HTML中提取链接?

Ruby 如何使用正则表达式从HTML中提取链接?,ruby,regex,Ruby,Regex,我想从google.com中提取链接;我的HTML代码如下所示: <a href="http://www.test.com/" class="l" 代码是: require "open-uri" url = "http://www.google.com/search?q=ruby" source = open(url).read() links = source.scan(/"(.*?)" class="l"/) links.each { |link| puts #{link}

我想从google.com中提取链接;我的HTML代码如下所示:

<a href="http://www.test.com/" class="l"
代码是:

require "open-uri"
url = "http://www.google.com/search?q=ruby"

source = open(url).read()
links = source.scan(/"(.*?)" class="l"/) 

links.each { |link| puts #{link} 
}
问题是,它没有输出网站链接

我怎么了

您正在尝试使用正则表达式解析HTML。不要那样做。正则表达式甚至不能覆盖有效XHTML所允许的语法范围,更不用说真实世界的标记汤了。使用HTML解析器库,如Hpricot

FWIW,当我获取“”时,我不会在返回的标记中的任何位置接收到“class=l”。也许这取决于你使用的是哪个本地谷歌,以及/或者你是否登录或者是否拥有谷歌cookie。你的剧本和我一样,不会

我怎么了

您正在尝试使用正则表达式解析HTML。不要那样做。正则表达式甚至不能覆盖有效XHTML所允许的语法范围,更不用说真实世界的标记汤了。使用HTML解析器库,如Hpricot

FWIW,当我获取“”时,我不会在返回的标记中的任何位置接收到“class=l”。也许这取决于你使用的是哪个本地谷歌,以及/或者你是否登录或者是否拥有谷歌cookie。你的脚本和我一样,不会。

那些链接实际上有class=l而不是class=l。顺便说一句,为了说明这一点,我在方法中添加了一些日志记录,以便您可以在不同阶段查看输出并对其进行调试。我搜索了您希望找到的字符串,但没有找到,这就是您的正则表达式失败的原因。所以我找到了您真正想要的字符串,并相应地修改了正则表达式。调试技巧很方便

require "open-uri"
url = "http://www.google.com/search?q=ruby"

source = open(url).read

puts "--- PAGE SOURCE ---"
puts source

links = source.scan(/<a.+?href="(.+?)".+?class=l/)

puts "--- FOUND THIS MANY LINKS ---"
puts links.size

puts "--- PRINTING LINKS ---"
links.each do |link|
  puts "- #{link}"
end
我还改进了你的正则表达式。您正在查找一些以打开标记开始的文本这些链接实际上具有class=l而不是class=l。顺便说一句,为了说明这一点,我在方法中添加了一些日志记录,以便您可以在不同阶段查看输出并对其进行调试。我搜索了您希望找到的字符串,但没有找到,这就是您的正则表达式失败的原因。所以我找到了您真正想要的字符串,并相应地修改了正则表达式。调试技巧很方便

require "open-uri"
url = "http://www.google.com/search?q=ruby"

source = open(url).read

puts "--- PAGE SOURCE ---"
puts source

links = source.scan(/<a.+?href="(.+?)".+?class=l/)

puts "--- FOUND THIS MANY LINKS ---"
puts links.size

puts "--- PRINTING LINKS ---"
links.each do |link|
  puts "- #{link}"
end

我还改进了你的正则表达式。您正在寻找一些以打开标记开始的文本。坦率地说,问题是您使用的是正则表达式。问题是HTML就是我们所知道的a,而正则表达式只能是我们所知道的一类语言


您应该做的是将页面数据发送到能够处理HTML代码的解析器,例如Hpricot,然后遍历从解析器获得的解析树。

说穿了,问题是您使用的是正则表达式。问题是HTML就是我们所知道的a,而正则表达式只能是我们所知道的一类语言


您应该做的是将页面数据发送到能够处理HTML代码的解析器,如Hpricot,然后遍历从解析器获得的解析树。

是的。那也是。HTML解析器在这方面做得更好。嗯,是的。那也是。HTML解析器在这方面做得更好。