Ruby Mechanize、Nokogiri 和 Net::HTTP

2024-01-08

我使用 Net::HTTP 进行 HTTP 请求并获取响应:

uri = URI("http://www.example.com")
http = Net::HTTP.start(uri.host, uri.port, proxy_host, proxy_port)
request = Net::HTTP::Get.new uri.request_uri
response = http.request request # Net::HTTPResponse object
body = response.body

如果我必须使用 Nokogiri gem 来解析这个 HTML 响应,我会这样做:

nokogiri_obj = Nokogiri::HTML(body)

但如果我想使用 Mechanize gem,我需要这样做:

agent = Mechanize.new
mechanize_obj = agent.get("http://www.example.com")

我是否可以使用 Net::Http 获取 HTML 响应,然后使用 Mechanize gem 将其转换为 Mechanize 对象,而不是使用agent.get()?


EDIT:

绕行的原因agent.get()方法是因为我想使用EventMachine::Iterator使并发EM-HTTP要求。

EventMachine.run do
  EM::Iterator.new(urls, 3).each do |url,iter|
    puts "giving   #{url}   to httprequest now"
    http = EM::HttpRequest.new(url).get
    http.callback { |resp|
      uri = resp.send(:URI, url)
      puts "inside callback of #{url}"
      body = resp.response
      page = agent.parse(uri, resp, body)
    }
    iter.next
  end
end

但它不起作用。我收到错误:

/usr/local/rvm/gems/ruby-1.9.3-p194/gems/mechanize-2.5.1/lib/mechanize.rb:1165:in`parse': undefined method `[]' for #<EventMachine::HttpClient:0x0000001c18eb30> (NoMethodError)

当我使用parse方法用于Net::HTTP它工作正常,我得到了 Mechanize 对象:

 uri = URI("http://www.example.com")
 http = Net::HTTP.start(uri.host, uri.port, proxy_host, proxy_port)
 request = Net::HTTP::Get.new uri.request_uri
 response = http.request request # Net::HTTPResponse object
 body = response.body
 agent = Mechanize.new
 page = agent.parse(uri, response, body)     

我是否传递了错误的论点parse使用 em-http 时的方法?


我不确定您为什么认为使用 Net::HTTP 会更好。 Mechanize 将处理重定向和 cookie,并提供对 Nokogiri 解析文档的现成访问。

require 'mechanize'

agent = Mechanize.new
page = agent.get('http://www.example.com')

# Use Nokogiri to find the content of the <h1> tag...
puts page.at('h1').content # => "Example Domains"

注意,设置user_agent无需访问 example.com。


如果您想使用线程引擎来检索页面,请查看伤寒和九头蛇 http://typhoeus.github.com/.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Ruby Mechanize、Nokogiri 和 Net::HTTP 的相关文章

随机推荐

  • 如何编译 Latex 文档中 24 页的前 2 页?

    我的 Latex 作品有超过 24 页 我只需要pdf格式的摘要和简介 你怎么能只编译前两页呢 此外大卫的好建议 https stackoverflow com questions 757689 how can i compile firs
  • Dialogflow CX |如何让机器人发起对话?

    Dialogflow ES 有一个名为 WELCOME 的事件 该事件使机器人可以发起对话 如何在 Dialogflow CX 中执行相同操作 Dialogflow CX 的起始页中没有条目履行选项 Edit Delete the Defa
  • C++ 具有类内初始值设定项的成员必须是 const

    我正在尝试在我的类中创建一个静态字符串 在我的头文件中 static string description foo 但我收到此错误 IntelliSense a member with an in class initializer mus
  • 在对象数组中插入新元素并对数组进行排序

    我有一个对象数组 其中包含学生的姓名和分数 像下面这样 我如何计算每个学生的 平均 分数并比较 平均 分数以获得尖子生 我不想使用 ES6 var Students name Bob marks 78 80 89 90 68 name Al
  • Spring-Security 3/Spring MVC 和可怕的 @Secured/RequestMapping

    我在向控制器添加安全注释时遇到了很多问题 事实证明让我的控制器实现一个InitializingBean 是个坏主意 public class MyController implements InitializingBean Secured
  • 取消 PendingIntent

    在中使用 PendingIntent 时AppWidgetProvider 我使用以下代码 views setOnClickPendingIntent viewId PendingIntent getBroadcast context 0
  • 无法使用 CSS 网格定位 HTML 图例标记

    问题 出于可访问性的原因 我有一个包含多个字段集和图例标签的表单 我希望图例标签位于输入字段下方 由于我使用 CSS Grid 作为字段集 因此使其工作 在 Firefox 上 的唯一方法是为图例标签提供绝对定位 在其他浏览器中 例如 Ch
  • C++ 中具有按位数据的结构[重复]

    这个问题在这里已经有答案了 可能的重复 将位域转换为 int https stackoverflow com questions 2468708 converting bit field to int 我正在开发一个应用程序 其中一部分处理
  • 如何转储来自 JVM 堆老年代的 Java 对象?

    有没有工具可以转储旧代 JVM 堆 换句话说 我如何判断一个对象是来自年轻代还是老年代 如果您运行 Oracle JDK 或 OpenJDK 则可以使用以下命令执行此操作热点可服务性代理 http openjdk java net grou
  • 为 pygame 中的平台添加碰撞检测

    我正在开发一款小型平台游戏 您可以在其中放置块来制作一个关卡 然后玩它 我有重力 跳跃和左右移动 但我不确定如何让玩家在向左或向右移动时与墙壁碰撞 我希望它的工作方式是这样的 if key K LEFT if not block to th
  • 使用 bootstrapvalidator AJAX SubmitHandler 不起作用

    我正在使用 Bootstrap 验证https github com nghuuphuoc bootstrapvalidator https github com nghuuphuoc bootstrapvalidator 我有一个问题 s
  • 使用 JavaScript 获取变量名称

    我想创建一个日志函数 可以在其中插入变量名称 如下所示 var a 123 b abc log a b 结果在 console log 中应该如下所示 a 123 b abc 获取变量的值没有问题 但是如何获取变量名称呢 该函数应该是通用的
  • 如何使 celery 任务从任务内部失败?

    在某些情况下 我想让芹菜任务从该任务中失败 我尝试了以下方法 from celery task import task from celery import states task def run simulation if some co
  • 如何在iOS项目中控制多个导航控制器

    我的项目的结构如下 最初 当用户注册或尝试登录时 初始导航控制器应该可以工作 并且在成功注册 登录后 用户应该被带到选项卡栏控制器的第一个选项卡 但我面临的问题是我在选项卡栏视图中看到了 2 个导航栏 有人可以指导我如何以正确的方式实现这一
  • Android 偏好,是否必须是唯一的?

    For my private static final String PREFS NAME mypref 每个应用程序的 PREFS NAME 都必须是唯一的吗 或者我可以一遍又一遍地使用同一个 每个应用程序的它必须是唯一的 不同的应用程序
  • 加载数据INFILE错误代码:13

    在我的远程 MySQL 中 当我尝试执行此查询时 我收到 MySQL 错误代码 13 Query LOAD DATA INFILE httpdocs testFile csv INTO TABLE table temp FIELDS TER
  • Google Drive API V3 - 推送通知

    从昨天早上开始 我就被谷歌驱动器 API 请求困住了 正如这里所解释的 https developers google com drive api v3 push https developers google com drive api
  • JPA 和泛型

    我想知道带有泛型的抽象类如何处理 JPA 我的意思是该字段需要什么样的注释 考虑这些 MappedSuperclass public abstract class AbstractMyClass
  • 如何在SICStus Prolog中模拟SWI-Prolog的atom_to_term(+Atom, -Term, -Bindings)?

    我正在使用 SICStus Prolog 编写 Dali 代理 我需要将原子转换为术语 但我无法使用atom to term内置于 SWI Prolog Use library codesio http sicstus sics se si
  • Ruby Mechanize、Nokogiri 和 Net::HTTP

    我使用 Net HTTP 进行 HTTP 请求并获取响应 uri URI http www example com http Net HTTP start uri host uri port proxy host proxy port re