0

我有以下内容:

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

Anemone.crawl("http://www.findbrowsenodes.com/", :delay => 3) do |anemone|
  anemone.on_pages_like(/http:\/\/www.findbrowsenodes.com\/us\/.+\/[\d]*/) do | page |

    doc = Nokogiri::HTML(open(page.url))

    id       = doc.at_css("#n_info #clipnode").text unless doc.at_css("#n_info #clipnode").nil?

    File.open("#{node_id}.html", "wb") do |f|
      f.write(open(page).read)
    end
  end
end

所以我试图将每个 URL 保存为一个 html 文件:

    File.open("#{id}.html", "wb") do |f|
      f.write(open(page).read)
    end

但我得到这个错误:

alex@alex-K43U:~/rails/anemone$ ruby​​ anemone.rb /home/alex/.rvm/rubies/ruby-1.9.3-p0/lib/ruby/1.9.1/open-uri.rb:35: in open': can't convert Anemone::Page into String (TypeError) from /home/alex/.rvm/rubies/ruby-1.9.3-p0/lib/ruby/1.9.1/open-uri.rb:35:in open' from anemone.rb:27:in block (3 levels) in <main>' from anemone.rb:26:inopen' from anemone.rb:26:in `block (2 levels) in '

这样做的正确方法是什么?

4

1 回答 1

1

有几个问题/困惑:

  1. 正如错误所说,这些open方法需要一个String(即url),但您提供的是一个Anemone::Page对象。

    该对象有一个url方法,您已经在第 9 行使用了该方法。

  2. 第 9 行:open(page.url)

    您已经在打开该页面,因此您可以重复使用它。但:

  3. 根据文档http://anemone.rubyforge.org/doc/classes/Anemone/Page.html Anemone::Page包含一个body可能已经包含内容的方法(我只是在猜测,没有使用或尝试过该库)。如果是这种情况,则无需使用open.

在我看来,以下未经测试的代码可能更像您正在寻找的内容:

doc = Nokogiri::HTML(page.body)

# [snip]

File.open("#{node_id}.html", "wb") do |f|
  f.write(page.body)
end
于 2013-09-05T10:52:27.810 回答