2

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

我试过了:

if Nokogiri::HTML(open("http://example.com"))
  #DO REQUIRED TASK
end

但这会在尝试打开页面时立即引发错误。我想返回它是否是任何类型的文档的结果。

我要么得到错误:

no such file or directory

或者:

getaddrinfo: Name or service not known

取决于我如何尝试进行检查。

4

3 回答 3

4

我将从以下内容开始:

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。一旦你知道了这些,你可以尝试加载文件。

于 2013-01-15T01:11:00.027 回答
3

首先,在 Ruby 中“拯救 Exception => e”是一种不好的风格。[参考:http ://daniel.fone.net.nz/blog/2013/05/28/why-you-should-never-rescue-exception-in-ruby/ ]

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

于 2016-03-05T02:30:26.453 回答
1

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

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
于 2013-01-14T21:24:27.867 回答