我想检查用户输入的URL是否实际上是一个有效的页面。
我试着:
if Nokogiri::HTML(open("http://example.com"))
#DO REQUIRED TASK
end
但是在试图打开页面时立即抛出错误。我想返回它是否是任何类型的文档的结果。
我要么得到错误:
no such file or directory
或:
getaddrinfo: Name or service not known
取决于我如何检查
我会这样开始:
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并使用HTTP HEAD请求进行一些完整性检查,以找出正在检索的内容的大小和MIME-TYPE。一旦知道了这些,就可以尝试加载文件了。
首先,在Ruby中'rescue Exception => e'是不好的风格。[参考:http://daniel.fone.net.nz/blog/2013/05/28/why-you-should-never-rescue-exception-in-ruby/]
其次,对于这种情况,"rescue OpenURI::HTTPError => e"可能更合适。
我不熟悉处理异常,但像:
begin
page = Nokogiri::HTML(open("http://example.com"))
ensure
puts "not a document of any kind"
end
do_something_whith(page) if page
…应该可以。
或者(看完你的评论后):
begin
page = open("http://example.com")
ensure
puts "not a document of any kind"
end
Nokogiri::HTML(page) if page