我正在构建一个爬虫,我知道如何使用ruby mechanize使用以下代码从网上读取页面:
require 'mechanize'
agent = Mechanize.new
agent.get "http://google.com"
但是我可以使用Mechanize从文件系统中读取HTML文件吗?怎么样?
答案 0 :(得分:35)
只使用file://协议对我很有用:
html_dir = File.dirname(__FILE__)
page = agent.get("file:///#{html_dir}/example-file.html")
关于为什么有人会使用mechanize来读取本地html文件的问题:我发现它有必要用于测试目的 - 只需在本地存储一个示例文件并运行你的rspec。
答案 1 :(得分:4)
我无法让file://
协议正常工作。相反,我通过在本地保存网页并注册URI
stream = File.read("saved_google_page.html")
FakeWeb.register_uri(:get, "http://www.google.com", :body => stream, :content_type => "text/html")
让Fakeweb通过正常的机械化过程将其返回到幕后
agent = Mechanize.New
page = agent.get("http://www.google.com/")
答案 2 :(得分:2)
基于@Stephens答案;因为fakeweb
没有更新更新并且维护者情况不明确,所以这里有一个使用webmock
解决问题的答案,对于任何匆忙的人:
require 'webmock'
include WebMock::API
WebMock.enable!
stub_request(:get, "www.example.com").to_return(body: File.read("page.html"))
agent = Mechanize.New
page = agent.get("http://www.example.com/")
# ...
答案 3 :(得分:-8)
恕我直言,尝试使用机械化来解决这种情况是没有意义的。也许你想解析HTML。然后尝试nokogiri(mechanize也用它来解析)
e.g。使用
Nokogiri::HTML(open('index.html'))
而不是
session.get('http://www.google.com')