6

使用 Nokogiri 解析 HTTPresponse

您好,我无法使用 Nokogiri 解析 HTTPresponse 对象。

我使用这个函数在这里获取一个网站:

获取链接

def fetch(uri_str, limit = 10)
   
  
  # You should choose better exception.
  raise ArgumentError, 'HTTP redirect too deep' if limit == 0
  
  url = URI.parse(URI.encode(uri_str.strip))
  puts url
  
  #get path
  req = Net::HTTP::Get.new(url.path,headers)
  #start TCP/IP
  response = Net::HTTP.start(url.host,url.port) { |http|
        http.request(req)
  }
  case response
  when Net::HTTPSuccess
    then #print final redirect to a file
    puts "this is location" + uri_str
    puts "this is the host #{url.host}"
    puts "this is the path #{url.path}"
    
    return response
    # if you get a 302 response
  when Net::HTTPRedirection 
    then 
    puts "this is redirect" + response['location']
    return fetch(response['location'],aFile, limit - 1)
  else
    response.error!
  end
end




            html = fetch("http://www.somewebsite.com/hahaha/")
            puts html
            noko = Nokogiri::HTML(html)
            

当我这样做时,html 会打印出一大堆乱码,而 Nokogiri 抱怨说“node_set 必须是 Nokogiri::XML::NOdeset

如果有人可以提供帮助,将不胜感激

4

1 回答 1

5

第一件事。您的fetch方法返回一个Net::HTTPResponse对象,而不仅仅是主体。你应该把尸体提供给Nokogiri。

response = fetch("http://www.somewebsite.com/hahaha/")
puts response.body
noko = Nokogiri::HTML(response.body)

我已经更新了您的脚本,使其可以运行(如下)。有几件事是未定义的。

require 'nokogiri'
require 'net/http'

def fetch(uri_str, limit = 10)
  # You should choose better exception.
  raise ArgumentError, 'HTTP redirect too deep' if limit == 0

  url = URI.parse(URI.encode(uri_str.strip))
  puts url

  #get path
  headers = {}
  req = Net::HTTP::Get.new(url.path,headers)
  #start TCP/IP
  response = Net::HTTP.start(url.host,url.port) { |http|
        http.request(req)
  }

  case response
  when Net::HTTPSuccess
    then #print final redirect to a file
    puts "this is location" + uri_str
    puts "this is the host #{url.host}"
    puts "this is the path #{url.path}"

    return response
    # if you get a 302 response
  when Net::HTTPRedirection
    then
    puts "this is redirect" + response['location']
    return fetch(response['location'], limit-1)
  else
    response.error!
  end
end

response = fetch("http://www.google.com/")
puts response
noko = Nokogiri::HTML(response.body)
puts noko

该脚本没有给出错误并打印内容。由于您收到的内容,您可能会收到 Nokogiri 错误。我在使用 Nokogiri 时遇到的一个常见问题是字符编码。如果没有确切的错误,就不可能知道发生了什么。

我建议查看以下 StackOverflow 问题

ruby 1.9:UTF-8 中的无效字节序列 (特别是这个答案

如何将 Net::HTTP 响应转换为 Ruby 1.9.1 中的某种编码?

于 2012-07-05T13:02:25.547 回答