gpt4 book ai didi

Ruby Mechanize 网络爬虫库返回文件而不是页面

转载 作者:太空宇宙 更新时间:2023-11-03 17:26:48 24 4
gpt4 key购买 nike

我最近一直在使用 ruby​​ 中的 Mechanize gem 来编写一个 scraper。不幸的是,我试图抓取的 URL 在 GET 请求时返回一个 Mechanize::File 对象而不是 Mechanize::Page 对象.

我不知道为什么。我尝试过的每个其他 URL 都返回了一个 Mechanize::Page 对象。

有什么方法可以强制 Mechanize 返回一个 Page 对象吗?

最佳答案

这是正在发生的事情。

当您下载一个“普通”网页时,它的标题将有一个字段,内容类似于Content-Type text/html。当 Mechanize 看到这一点时,它知道将页面内容解释为 HTML 并将其解析为 Mechanize::Page 对象,完成链接和表单等等。

但是,如果您曾经点击过“下载 CSV 数据”或“下载 PDF”链接,或者简而言之,任何非 HTML 格式的链接,您都会收到一个没有 Content 的页面-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 格式。参见 the Mechanize docs on 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

让我知道这是否有效。

关于Ruby Mechanize 网络爬虫库返回文件而不是页面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6918277/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com