Ruby on rails 检查Nokogiri HTML文档是否可用
我想检查用户输入的URL实际上是否是有效页面 我试过: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
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