检查Nokogiri HTML文档是否可用

时间:2013-01-14 20:44:30

标签: ruby-on-rails ruby screen-scraping nokogiri

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

我试过了:

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

但是在尝试打开页面时会立即抛出错误。我想返回它是否是任何文件的结果。

我得到错误:

no such file or directory

或:

getaddrinfo: Name or service not known

取决于我如何进行检查。

3 个答案:

答案 0 :(得分: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。一旦你知道了,你可以尝试加载文件。

答案 1 :(得分:3)

首先,拯救Exception =>的风格很糟糕。 E'在Ruby中。 [请参阅:http://daniel.fone.net.nz/blog/2013/05/28/why-you-should-never-rescue-exception-in-ruby/]

其次,对于这种情况,"救援OpenURI :: HTTPError => E"会更合适。

答案 2 :(得分: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