前言
本来是打算写一个抓取图片的脚本,然而自然需要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
然后等待就好。