为什么我从Nokogiri那里得到“错误的状态行”错误?

时间:2011-11-25 13:33:27

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

我的Ruby / Nokogiri脚本是:

require 'rubygems'
require 'nokogiri'
require 'open-uri'

f = File.new("enterret" + ".txt", 'w')

1.upto(100) do |page|
  urltext = "http://xxxxxxx.com/" + "page/"
  urltext << page.to_s + "/"
  doc = Nokogiri::HTML(open(urltext))
  doc.css(".photoPost").each do |post|
    quote = post.css("h1 + p").text
    author = post.css("h1 + p + p").text
    f.puts "#{quote}" + "#{author}"
    f.puts "--------------------------------------------------------"
  end
end

运行此脚本时出现以下错误:

http.rb:2030:in `read_status_line': wrong status line: "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\"" (Net::HTTPBadResponse)

但是我的脚本正确写入文件,只是这个错误不断出现。错误是什么意思?

1 个答案:

答案 0 :(得分:2)

在不知道您访问的网站的情况下,很难肯定地说,但我怀疑问题不在Nokogiri。

http.rb正在报告错误,这很可能是抱怨返回的HTTPd标头。 http.rb关注与HTTPd服务器的握手,并会抱怨丢失/格式错误的标头,但它不关心有效负载。

另一方面,Nokogiri会担心有效载荷,即HTML。 DOCTYPE应该是HTML有效负载的一部分,因此我怀疑他们的服务器正在发送HTML DOCTYPE而不是MIME文档类型,应该是"text/html"

在Ruby 1.8.7 http.rb文件中,您将在代码中看到以下几行:

def response_class(code)
  CODE_TO_OBJ[code] or
  CODE_CLASS_TO_OBJ[code[0,1]] or
  HTTPUnknownResponse
end

这似乎有可能产生你所看到的那种信息。