Читать локальный HTML-файл с помощью Mechanize - PullRequest
10 голосов
/ 28 сентября 2011

Я создаю сканер, я знаю, как использовать Ruby Mechanize для чтения страницы из сети, используя этот код:

require 'mechanize'
agent = Mechanize.new
agent.get "http://google.com"

Но можно ли использовать Mechanize для чтения HTML-файла из файловой системы??Как?

Ответы [ 4 ]

36 голосов
/ 06 июля 2012

просто с помощью протокола file: // отлично сработал для меня:

html_dir = File.dirname(__FILE__)
page = agent.get("file:///#{html_dir}/example-file.html")

и по поводу поднятого вопроса, почему кто-то будет использовать механизацию для чтения локальных html-файлов: я нашел это необходимым для целей тестирования - простосохраните файл примера локально и запустите ваш rspec для него.

4 голосов
/ 02 мая 2013

Мне не удалось заставить протокол file:// работать правильно для меня. Вместо этого я использовал Fakeweb , сохранив веб-страницу локально и зарегистрировав 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/")

См. Как протестировать приложение ruby, использующее механизацию

2 голосов
/ 11 мая 2017

на основе ответа @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/")

# ...
0 голосов
/ 28 сентября 2011

ИМХО не имеет смысла пытаться использовать механизировать для такой ситуации.Может быть, вы хотели бы разобрать HTML.Затем попробуйте nokogiri (механизатор использует его и для анализа)

например, используйте

Nokogiri::HTML(open('index.html'))

вместо

session.get('http://www.google.com')
...