我们在做各种自动化处理时,常常会希望能更加智能的得到网页中自己想要的元素,最好是象 css 和 div 中的信息来取得,就会更加方便,这个 Web::Scraper 是我用过的几个模块中最方便的,这也是大侠 miyagawa 所写.根据 ChangeLog 最早是 2007 年开发,好象 Web::Scraper 的灵感是来自己 Ruby 的 Scrapi ,它是一个使用 DSL 风格来写的 Scrapper .
建议使用Firefox 的 firebug 和这个软件配合是极品.直接使用 firebug 选择要取出的文件的相关的部分点右键,选择"查看元素",在深色选中的部分在次点右键,选择 "复制 XPath". 选择内容->查看元素-> 复制 XPath .
如下,直接在要处理的元素上点右键,选择查看元素.
接着,要 Firebug 出现的界面的元素中选择 复制 XPath.
会得到 XPath 的地址 ,'/html/body/div/div/div[2]/div[3]/div[4]/ul/li[6]/a' 象这种.这样不用我们自己来写网页的 Xpath 的地方了 ,相当的方便.不过有个小细节,好象 scraper 不支持多个 tbody .所以记的要删除.
使用 Web::Scraper 前,我们可以直接使用 scraper 的命令行模式,这个超级方便我们来调试,直到我们取出所有我们要的文件内容.
(1. 使用 scraper 进入命令行模式
#scraper Filename or Url‘
下面我直接打开一个在线的网页
1
2
|
#scraper http://icp.valu.cn/piliang/chaxun?domains=php-oa.com
scraper>
|
(2. 显示当前正在处理的 HTML 本身.
进入后,有几个常用的命令可以使用,比如下面的命令,它会显示下载 or 打开的整个网页的内容,显示 HTML 本身
1
2
3
|
scraper> s
.....
|
(3. 显示一个 XPath 中的详细内容
在这个命行中,有个 WARN 的方法可以调用.用来显示当前 XPath 中的内容
1
2
3
4
5
6
7
8
9
|
scraper> process
'/html/body/div/div[8]/table/tr[2]/td'
,
WARN
;
<td >1</td>
<td >扶凯</td>
<td >个人</td>
<td >渝ICP备10001691号-1</a></td>
<td >扶凯</td>
<td><div><a href=
"/go/?domain=www.php-oa.com"
target=
"_blank"
>www.php-oa.com</a></div></td>
<td >2010-01-07</td>
<td ><a href=
"/details/%d3%e5ICP%b1%b810001691%ba%c5-1"
target=
"_blank"
>详情</a></td>
|
(4. 给标签中的内容存到一个变量 key 中
下面的显示,是给内容直接转成 Yaml 的格式显示出来.另外还可以存成一个数组,
主要语法是
process <CSS式 or XPath式>, '保存的变量的名字' => '保存方式';
接着看下面吧
1
2
3
4
|
scraper> process
'/html/body/div/div[8]/table/tr[2]/td[6]'
,
'key'
=>
'TEXT'
scraper> y
---
key: www.php-oa.com
|
(5. 给标签中的内容存到一个数组中
以数组的方法来取得多个文件直接在变量名后加 [] 就行了,这是这的 td 一定要是在这个下面有多个.本来值是 td[1],td[2] 这种,数组的话,给 XPath 替换成 td.
1
2
3
4
5
6
7
8
9
10
11
12
|
scraper> process
'/html/body/div/div[8]/table/tr[2]/td'
,
'key[]'
=>
'TEXT'
scraper> y
---
key:
- 1
- 扶凯
- 个人
- 渝ICP备10001691号-1
- 扶凯
- www.php-oa.com
- 2010-01-07
- 详情
|
(6. 输出刚才测试的内容成 Perl 文件
这个命令执行最后一个输入成 Perl 文件的形式,c all 会输出所有测试过的内容成一个 Perl 文件
1
2
3
4
5
6
7
8
9
10
11
|
scraper> c
#!/usr/bin/perl
use
strict;
use
Web::Scraper;
use
URI;
my
$uri
= URI->new(
"http://icp.valu.cn/piliang/chaxun?domains=php-oa.com"
);
my
$scraper
= scraper {
process
'/html/body/div/div[8]/table/tr[2]/td[6]'
,
'key'
=>
'TEXT'
;
};
my
$result
=
$scraper
->scrape(
$uri
);
|
上面的例子中,都有个 TEXT 是指的保存方式' .
process <CSS式 or XPath式>, '保存的变量的名字' => '保存方式';
保存方式的详细方法有如下几种:
TEXT
只有普通的文字,才会放进来,如下所示
'<a href="/go/?domain=www.php-oa.com" target="_blank">www.php-oa.com</a>'
HTML
整个 html 的内容都会包含进来,象下面这样的输出,会包含有 html 本身的标签. 如下所示
www.php-oa.com@ 列表