Вот что происходит.
Когда вы загружаете «обычную» веб-страницу, ее заголовок будет иметь поле, похожее на Content-Type text/html
. Когда Mechanize видит это, он знает, как интерпретировать содержимое страницы как HTML, и анализирует его в объект Mechanize :: Page, содержащий ссылки, формы и тому подобное.
Но если вы когда-либо нажимали на ссылку с надписью «загрузить данные CSV» или «скачать PDF» или, в общем, все, что не является HTML, вы получаете страницу, на которой нет Content-Type
text/html
. Поскольку Mechanize не может проанализировать не-html в объект Mechanize :: Page, он упакует содержимое в объект Mechanize :: File.
То, что вы делаете с объектом Mechanize :: File, зависит от того, что вы пытаетесь выполнить. Например, если вы знаете, что страница, которую вы посетили, представляла собой данные CSV, а не HTML, вы можете извлечь данные CSV следующим образом:
page = web_agent.get(some_url_that_references_csv_data)
parsed_csv = CSV.parse(page.body)
Если вы хотите проявить фантазию, вы можете написать свои собственные парсеры, которые позволят Mechanize обрабатывать не-HTML форматы. Смотрите Механизировать документы на PluggableParser , если вы хотите пойти по этому пути. Но вы можете многого добиться, работая напрямую с объектом Mechanize :: File.
дополнение в ответ на комментарий @ user741072
Если, с другой стороны, если страница имеет значение HTML и кто-то пренебрегал указанием content-type
на HTML, вы можете написать метод, который заменяет html-анализатор на анализатор по умолчанию достаточно долго, чтобы разобрать страницу. Это заставит анализировать как HTML:
def with_html_parser(agent, &body)
original_parser = agent.pluggable_parser.default
agent.pluggable_parser.default = agent.pluggable_parser['text/html']
begin
yield
ensure
agent.pluggable_parser.default = original_parser
end
end
Дайте мне знать, если это поможет.