Rexdf

The devil is in the Details.

Cygwin安装nokogiri

| Comments

前言

本来是打算写一个抓取图片的脚本,然而自然需要Parse HTML了,C语言有谷歌大名鼎鼎的gumbo-parser,Python自然有妇孺皆知的Beautiful Soup,而Java实现则是较多功能完善,Perl语言有HTML::Parser等等不一而足。而且仅仅抓取图片,往往有现成的脚本或者专门针对特定网站的浏览器助手Chrome Plugins或者Firefox Plugins。然而由于最近对于Python和Perl有些腻了,想玩玩Ruby,实际上我已经借助Firefox的DownloadThemALL下载完成了图片了。

ruby环境

在win下面越来越喜欢cygwin了,一方面自然是因为cygwin的更新频率了,基本上和Ubuntu一样,每过了一周左右,更新就会发现有软件升级了,这样自然就是软件的错误越来越少。 其次我还是比较喜欢Linux的bash的,循环相对cmd来说要强很多。 因为有了cygwin,那么Perl和Ruby这两个基本不需要另外安装了,运行大部分的软件,安装CPAN和Gems都还很方便,当然这里还是需要一定的技巧的。不过Python和Java则最好是另外安装,而且把他们放到cygwin/bin/的%PATH%环境变量前面,这样的话,Cygwin运行的时候Cygwin的Python和Java自动重新配置$PATH就不会与Win的发生干扰了。

编译安装

我尝试着直接使用gem instal nokogiri安装,自然是提示错误了,当时具体什么错误则说的不够详细,自然也就不知道怎么path了。

1. 下载源码

git clone https://github.com/sparklemotion/nokogiri,git

2. 安装Libxml2和Libxsl依赖

首先关闭cygwin打开setup.exe,搜索libxml2和libxsl,把lib装上,我是把Python下面的也装了的,理论上应该不需要Python下面的。

3. 安装racc

这个比较简单,直接gem install racc,即可。 检验便是敲入racc,会提示no input而不是找不到命令

4. 安装rex

这个比较难,首先直接运行gem install rex,会提示一个错误,但是安装完成是OK的。 接着输入rex会提示如下的错误

$ rex
/usr/lib/ruby/gems/1.9.1/gems/rex-1.0.2/lib/rex/rexcmd.rb:66:in `initialize': undefined method `collect' for #<String:0x80195bd8> (NoMethodError)
        from /usr/lib/ruby/gems/1.9.1/gems/rex-1.0.2/bin/rex:18:in `new'
        from /usr/lib/ruby/gems/1.9.1/gems/rex-1.0.2/bin/rex:18:in `<top (required)>'
        from /usr/bin/rex:23:in `load'
        from /usr/bin/rex:23:in `<main>'

我们打开定位到/usr/lib/ruby/gems/1.9.1/gems/rex-1.0.2/lib/rex/rexcmd.rb,会发现

class Cmd
OPTIONS  =  <<-EOT

o -o --output-file <outfile>  file name of output [<filename>.rb]
o -s --stub             - append stub code for debug
o -i --ignorecase       - ignore char case
o -C --check-only       - syntax check only
o -  --independent      - independent mode
o -d --debug            - print debug information
o -h --help             - print this message and quit
o -  --version          - print version and quit
o -  --copyright        - print copyright and quit

EOT
....
def initialize
    @status  =  2
    @cmd  =  File.basename($0, ".rb")
    tmp  =  OPTIONS.collect do |line|
...
def usage( msg=nil )
    f  =  $stderr
    f.puts "#{@cmd}: #{msg}"  if msg
    f.print <<-EOT
Usage: #{@cmd} [options] <grammar file>
Options:
    EOT

    OPTIONS.each do |line|

根据运行rex提示的错误就是OPTIONS.collect这里才错误了,很明显嘛,OPTIONS是一个string,查一下就发现问题的关键了,ruby的1.9以后 Ruby 1.9: String is no longer Enumerable. …Can't call collect directly; we have to split it into lines first. 所以,String是没有collect方法的了,String不是可枚举的。知道原因就好pach了。直接改成OPTIONS.split(/\n/).each do |line|tmp = OPTIONS.split(/\n/).collect do |line|即可。然后再次运行rex则正常的提示了:

$ rex
rex: no grammar file given
Usage: rex [options] <grammar file>
Options:
-o,--output-file <outfile>  file name of output [<filename>.rb]
-s,--stub                   append stub code for debug
-i,--ignorecase             ignore char case
-C,--check-only             syntax check only
--independent               independent mode
-d,--debug                  print debug information
-h,--help                   print this message and quit
--version                   print version and quit
--copyright                 print copyright and quit

5. 安装

cd nokogiri
rake

然后等待就好。

Comments