抽取规则
[!WARNING|style:callout|label:注意事项|iconVisibility:default|labelVisibility:default|className:block-warning]
1、每一条任务URL配置项唯一的对应一条规则配置项,并且指定的规则名必须一一对应;
2、规则域的取值类型只能是数组;
3、对于单条任务,相应规则域的深度即数组的深度只能是2;
4、对于多条任务,相应规则域的深度即数组的深度只能是3;
$task = array(
'rule_name1' => 'http://www..blogdaren.com';
...........................................;
'rule_nameN' => 'http://www.phpcreeper.com';
);
//对于多条任务,可以看到对应规则域的深度是3而且只能是3
$rule = array(
'rule_name1' => array(
'field1' => ['selector', 'flag', 'range', 'callback'],
.....................................................,
'fieldN' => ['selector', 'flag', 'range', 'callback'],
);
.........................................................,
'rule_nameN' => array(
'field1' => ['selector', 'flag', 'range', 'callback'],
.....................................................,
'fieldN' => ['selector', 'flag', 'range', 'callback'],
);
);rule_name
每一个任务都应当提供一个相对应的唯一的规则名称,这样我们就能很方便的根据规则名索引到想要的数据,
如果规则名留空不配置的话,内核默认将采用md5($task_url)作为唯一的规则名。
selector
和jQuery选择器一模一样,其取值可以是#idName or .className or Html Element等等;此外,当flag
取值为preg或pregs时,选择器还可以是一个标准的正则表达式。
flag
attr: 用于获取HTML元素的属性 【注意: 此处attr取值是指HTML元素的属性名称如src、href等等】
html: 用于获取匹配元素包裹的HTML元素片段
text: 用于获取HTML元素包裹的文本内容
preg: preg_match()函数的封装实现
pregs: preg_match_all()函数的封装实现
range
用于进一步缩小数据提取范围,取值可以是#idName or .className or Html Element等等。
callback
可以自定义一个回调函数,不过切记务必要返回所期望的数据。
演示代码
$html = "
";$rule = array(
'链接元素' => ['div', 'html'],
'链接文本' => ['#site', 'text'],
'链接地址' => ['div.site', 'href'],
'回调数据' => ['/(.*)/is', 'preg', [], function($field_name, $data){
return 'Hello ' . $data[1];
}],
);
$data = $parser->extractField($html, $rule, 'rule1');
pprint($data['rule1']);
//输出结果
Array
(
[0] => Array
(
[链接元素] => PHPCreeper
[链接文本] => PHPCreeper
[链接地址] => http://www.phpcreeper.com
[回调数据] => Hello PHPCreeper
)
)