Ruby on rails 检查Nokogiri HTML文档是否可用

Ruby on rails 检查Nokogiri HTML文档是否可用,ruby-on-rails,ruby,screen-scraping,nokogiri,Ruby On Rails,Ruby,Screen Scraping,Nokogiri,我想检查用户输入的URL实际上是否是有效页面 我试过: if Nokogiri::HTML(open("http://example.com")) #DO REQUIRED TASK end 但这会在尝试打开页面时立即抛出错误。我想返回它是否是任何类型的文档的结果 我要么得到错误: no such file or directory 或: 取决于我如何进行检查。我不熟悉异常的处理,但类似于: begin page = Nokogiri::HTML(open("http://examp

我想检查用户输入的URL实际上是否是有效页面

我试过:

if Nokogiri::HTML(open("http://example.com"))
  #DO REQUIRED TASK
end
但这会在尝试打开页面时立即抛出错误。我想返回它是否是任何类型的文档的结果

我要么得到错误:

no such file or directory
或:


取决于我如何进行检查。

我不熟悉异常的处理,但类似于:

begin
  page = Nokogiri::HTML(open("http://example.com"))
ensure
  puts "not a document of any kind"
end
do_something_whith(page) if page
…应该这样做

或者(在阅读您的评论后):


我会从以下内容开始:

require 'nokogiri'
require 'open-uri'

begin
  doc = Nokogiri.HTML(open(url))
rescue Exception => e
  puts "Couldn't read \"#{ url }\": #{ e }"
  exit
end

puts (doc.errors.empty?) ? "No problems found" : doc.errors
Nokogiri将文档的
errors
数组设置为解析过程中发生的任何错误的值

不过,这只解决了问题的一部分。恶意的人喜欢破坏东西,这很容易破坏。一般来说,对用户提供给你的任何东西都要非常小心,尤其是当你的网站暴露在互联网上时


在告诉OpenURI加载要提供给Nokogiri的文件之前,您应该嗅探该URL,并使用请求进行一些合理性检查,以找出所检索内容的大小和MIME类型。一旦你知道了这些,你可以试着加载文件。

首先,在Ruby中“rescue Exception=>e”是不好的风格。 [参考:]


其次,对于这种情况,“rescue OpenURI::HTTPError=>e”更合适。

我在打开点得到了相同的getaddrinfo:Name或service not known异常。这就像是程序偷窥,不管发生什么事情,都会在那一点上把头咬下来。同样的交易。似乎开放uri是这里的一个大问题。我必须给另一个人打勾,但谢谢你让我知道正确的方向。如果有人将URL传递到图像或多GB文件,该怎么办?您的代码无法处理Nokogiri爆炸或因主机内存不足而不经意地给主机添加剂量。你需要处理异常,并尝试嗅探URL,以确定在你要求Nokogiri解析它之前,你将得到什么。实际上,在你发布之前,我自己就已经知道了。这的确是正确的想法。
begin
  page = open("http://example.com")
ensure
  puts "not a document of any kind"
end
Nokogiri::HTML(page) if page
require 'nokogiri'
require 'open-uri'

begin
  doc = Nokogiri.HTML(open(url))
rescue Exception => e
  puts "Couldn't read \"#{ url }\": #{ e }"
  exit
end

puts (doc.errors.empty?) ? "No problems found" : doc.errors