Ruby 如何使用正则表达式从HTML中提取链接?
我想从google.com中提取链接;我的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}
<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解析器在这方面做得更好。