`
RednaxelaFX
  • 浏览: 3049501 次
  • 性别: Icon_minigender_1
  • 来自: 海外
社区版块
存档分类
最新评论

把Mechanize的html_parser改回到Hpricot

    博客分类:
  • Ruby
阅读更多
记得我最初开始用Nokogiri就是因为Mechanize用的HTML/XML解析器从Hpricot转到了Nokogiri。不过Nokogiri用起来问题多多,内存泄漏的问题貌似一直没解决,之前在1.9上想用的时候也是segfault,然后对格式不良好的HTML的解析也有问题。虽说_why离开了人们的视野,但在whymirror上还能找到why留在github的代码,包括当前版本的Hpricot;通过RubyGems也还能安装到Hpricot。
最近在写某脚本的时候又被Nokogiri绊倒了,一怒,决定把机上的Mechanize的html_parser换回到Hpricot去。之前NS老兄已经这么做过一次,向他咨询了经验后,这改造工程顺利完成。下面把步骤记下来。

这次测试的机器上,我安装的是RubyInstaller Technology Preview2的1.8.6-p383,安装到C:\Ruby。这个新的RubyInstaller装的Ruby上要安装Hpricot得先把devkit也装上才行,为了构建Hpricot用。下载devkit-3.4.5r3-20090411.7z,解压到Ruby的安装目录,然后从devkit目录里的MSys来完成后面需要命令行的步骤。通过
gem install mechanize

可以安装到Mechanize 0.9.3,然后同样
gem install hpricot

可以安装到Hpricot 0.8.2。
如果是用老的官方版RubyInstaller装的Ruby 1.8.6则不需要devkit,直接用RubyGems就能装上Hpricot。如果你用的是自己构建出来的Ruby的话想必这些gem要怎么构建也该了解。下面描述的步骤也对应非Windows用户,因为只涉及纯Ruby代码的修改。

都装好之后,把下面提到的几个地方改过来:(注释里的是原本的代码,上面是新改的代码)

C:\Ruby\lib\ruby\gems\1.8\specifications\mechanize-0.9.3.gemspec
C:\Ruby\lib\ruby\gems\1.8\gems\mechanize-0.9.3\mechanize.gemspec
s.add_runtime_dependency(%q<hpricot>, [">= 0.8.2"])
# s.add_runtime_dependency(%q<nokogiri>, [">= 1.2.1"])
# ...
s.add_dependency(%q<hpricot>, [">= 0.8.2"])
# s.add_dependency(%q<nokogiri>, [">= 1.2.1"])

(这两个文件里有多处相同的代码要改,不放心的话在文件里搜一下吧)

C:\Ruby\lib\ruby\gems\1.8\gems\mechanize-0.9.3\lib\www\mechanize.rb
require 'hpricot'
# require 'nokogiri'

@html_parser = Hpricot
# @html_parser = Nokogiri::HTML


C:\Ruby\lib\ruby\gems\1.8\gems\mechanize-0.9.3\lib\www\mechanize\page.rb
      def parser
        return @parser if @parser

        if body && response
          #if mech.html_parser == Nokogiri::HTML
          #  @parser = mech.html_parser.parse(html_body, nil, @encoding)
          #else
            @parser = mech.html_parser.parse(html_body)
          #end
        end

        @parser
      end


C:\Ruby\lib\ruby\gems\1.8\gems\mechanize-0.9.3\lib\www\mechanize\util.rb
        def to_native_charset(s, code=nil)
          #if Mechanize.html_parser == Nokogiri::HTML
          #  return unless s
          #  code ||= detect_charset(s)
          #  Iconv.iconv("UTF-8", code, s).join("")
          #else
            s
          #end
        end

        def from_native_charset(s, code)
          #if Mechanize.html_parser == Nokogiri::HTML
          #  return unless s
          #  Iconv.iconv(code, "UTF-8", s).join("")
          #else
            s
          #end
        end


Mechanize的设计原本就考虑到了html_parser的切换,所以改起来并不费力。只是page.rb和util.rb里显式写了Nokogiri::HTML这点让人郁闷,要是去掉了require 'nokogiri'这些代码就会抱怨Nokogiri常量未定义。

幸好改造前先问了NS,不然我大概不知道要去改gemspec里的配置。以前一直没了解过RubyGems是怎么工作的orz

091109更新:刚试了在JRuby 1.4.0上用同样方式改造Mechanize让它用Hpricot 0.8.2-java来做html_parser,暂时没遇到什么问题。终于又可以在JRuby上用Mechanize了,泪目 TvT
分享到:
评论
7 楼 zhengb66 2011-03-04  
不错,还是Hpricot好用,速度又快,但最好用0.84版,0.83段溢出太严重。
6 楼 RednaxelaFX 2009-12-29  
yuan 写道
0.8.2到最新的0.9.1不知道是有bug还是把api改了,调用像这样的方法page.links.text('linkxx')会报告 undefined method text in array!%$!@#$
我卸了装0.8.1就没问题了,而且parser默认是hpricot了。

0.8.2到0.9.1是指Hpricot?那我先不要升级……
parser默认是Hpricot是指什么?新版Mechanize么?这个月都没升级过gems没留意动态 T T
5 楼 yuan 2009-12-29  
0.8.2到最新的0.9.1不知道是有bug还是把api改了,调用像这样的方法page.links.text('linkxx')会报告 undefined method text in array!%$!@#$
我卸了装0.8.1就没问题了,而且parser默认是hpricot了。
4 楼 yuan 2009-12-29  
哇靠,改完连编码都自动变了……原来的乱码是Nokogiri搞的啊。
3 楼 yuan 2009-12-29  
正好需要,试一下。
另外,FX有没其它ruby的抓网页工具组合推荐?
不知道mechanize能不能执行javascript……如果不能的话,导航就悲剧了。
2 楼 RednaxelaFX 2009-11-08  
night_stalker 写道
现在的 Mechanize 是 tenderlove (nokogiri 作者) 在维护…… 她比较阴险……

嗯我知道……话说这么改造了之后我要试试以前写的几个用Nokogiri出问题的脚本会不会就没事了
1 楼 night_stalker 2009-11-08  
现在的 Mechanize 是 tenderlove (nokogiri 作者) 在维护…… 她比较阴险……

相关推荐

    The_official_source_code_for_the_python-mechanize__mechanize.zip

    The_official_source_code_for_the_python-mechanize__mechanize

    mechanize_guanacast:用于下载所有 guanacasts 的网络抓取工具

    mechanize_guanacast 用于下载所有 guanacasts 的网络抓取工具 :) 要使用它,首先执行: gem install mechanize 然后使用它:ruby mechanize_guanacast.rb

    Mechanize相关资料

    Mechanize是一个强大的自动化Web浏览器库,主要用于Python编程语言。它允许程序员模拟用户在网站上的交互行为,如填写表单、点击链接、处理cookies等,是进行网页抓取和自动化测试的重要工具。在这个名为“Mechanize...

    ruby mechanize安装需要的gem包

    Ruby Mechanize 是一个非常强大的 Ruby 库,用于自动化与网站的交互,比如模拟浏览器操作、填写表单、点击链接等。在使用 Ruby Mechanize 之前,首要任务是正确安装其依赖的 gem 包。以下是对 Ruby Mechanize 安装...

    mechanize-2.7.3.gem

    ruby mechanize包,mechanize-2.7.3.gem

    multi-mechanize-master

    "multi-mechanize-master" 是一个开源项目,主要基于Python的`mechanize`库进行多线程爬虫操作。`mechanize`库是一个模拟浏览器行为的库,它可以帮助开发者编写自动化脚本,用于浏览网页、填写表单、点击链接等任务...

    ruby mechanize 2.7.2 gem 包

    ruby mechanize 2.7.2 gem 包

    Ruby-Mechanize一个让自动化web交互变得容易的ruby库

    让我们深入了解一下Mechanize库的核心功能和使用方法。 首先,Mechanize库提供了一个友好的API,可以方便地打开URL、导航页面和处理HTTP请求。通过`Mechanize.new`创建一个新的实例后,你可以使用`get`方法来访问...

    mechanize-源码.rar

    《深入解析mechanize:Python网页爬虫利器》 在Python的世界里,mechanize库是一个强大的工具,专为模拟浏览器行为而设计,尤其适用于自动化Web浏览和数据抓取任务。"mechanize-源码.rar"这个压缩包文件包含了...

    python第三方库-mechanize

    用python成为顶级黑客,第三方库必备,mechanize网络爬虫

    python mechanize 0.2.5

    Python Mechanize是一个强大的库,主要用于自动化Web浏览,它在Python编程中扮演着重要角色,尤其在Web爬虫和网页测试领域。Mechanize库模仿浏览器的行为,允许开发者以编程方式与网页交互,如填写表单、点击链接、...

    Ruby中的Mechanize的使用教程

    Ruby中实现网页抓取,一般用的是mechanize,使用非常简单。 安装 代码如下: sudo gem install mechanize 抓取网页 代码如下: require ‘rubygems’ require ‘mechanize’ agent = Mechanize.new page = agent.get...

    mechanize4j源程序及所有依赖的jar

    **机械师4j(mechanize4j)**是一个基于Java的开源爬虫库,它为Web自动化提供了方便。在编程领域,爬虫是用于自动抓取网页信息的工具,而mechanize4j则是这类工具的一个实现。该库模仿了Python的mechanize库,使得...

    mechanize:Mechanize是一个ruby库,可以轻松实现自动的Web交互

    机械化描述Mechanize库用于自动与网站进行交互。 Mechanize自动存储和发送Cookie,遵循重定向,并可以遵循链接和提交表单。 可以填写和提交表单字段。 机械化还可以将您曾经访问过的站点作为历史记录进行跟踪。依存...

    mechanize-js:Mechanize是一个Javascript库,可实现自动Web交互

    Mechanize自动存储和发送Cookie,跟随重定向,跟随链接并提交表单。 可以填写和提交表单字段。 机械化还可以将您曾经访问过的站点作为历史记录进行跟踪。入门在根文件夹中,您可以运行get_page示例: node examples...

    在Python中使用mechanize模块模拟浏览器功能

    mechanize模块是一个强大的工具,它提供了模拟浏览器的功能,包括处理表单提交、跟踪cookies和设置代理等。下面我们将详细探讨mechanize模块的使用方法。 首先,引入必要的库: ```python import mechanize import ...

    Python库 | mechanize-0.3.2-py2-none-any.whl

    这个资源是mechanize库的0.3.2版本,专为Python 2构建,支持多种平台。其以whl(wheel)格式提供,这是一种预编译的Python软件包,可以简化安装过程,避免了编译源代码的步骤。 在Python开发中,mechanize库主要...

    Python使用Mechanize模块编写爬虫的要点解析

    在Python编程中,开发Web爬虫时,常常会用到Mechanize模块,它是一个强大的库,用于模拟浏览器行为,特别是在处理登录、表单提交和交互性较强的网站时。Mechanize提供了对HTTP请求的控制,使爬虫能更好地模仿用户...

    Mechanize是一个ruby库,可以轻松实现自动的Web交互。-Ruby开发

    Mechanize¶↑docs.seattlerb.org/mechanize github.com/sparklemotion/mechanize描述¶↑Mechanize库用于自动与网站交互。 Mechanize自动存储和发送coo Mechanize¶↑docs.seattlerb.org/mechanize github....

    WWW-Mechanize-Chrome:自动化Chrome浏览器

    **WWW-Mechanize-Chrome** 是一个Perl模块,它扩展了流行的WWW-Mechanize库,使其能够模拟用户在Google Chrome浏览器中的交互行为。这个工具对于自动化网页浏览、数据抓取、测试以及任何需要与网页进行复杂交互的...

Global site tag (gtag.js) - Google Analytics