先回顾一下之前的采集参数约定:
* <li>约定采集参数格式如下</li>
* <li>1,标签属性/值形式,如:class=articleList|tips,id=fxwb|fxMSN|fxMSN
* <li>2,标签名称形式,如:div,p,span</li>
* <li>3,混合形式,如:class=articleList|tips,id=fxwb|fxMSN|fxMSN,div,p,span</li>
优化之后 采集参数约定:
* <li>约定采集参数格式如下</li>
* <li>1,标签属性/值形式,如:class=articleList.*|tips,id=fxwb|fxMSN|fxMSN
* 注意:属性值 支持正则表达式</li>
* <li>2,标签名称形式,如:div,p,span</li>
* <li>3,混合形式,如:class=articleList|tips,id=fxwb|fxMSN|fxMSN,div,p,span</li>
也就是 标签属性/值形式 :属性值 支持正则表达式了。
之前的采集功能基本够用了,但是还是存在不足,比如遇到某些节点属性值是随机变化的就无能为力了,如:采集 美食天下-资讯频道-食品行业资讯(http://www.meishichina.com/News/HangYe/) 具体内容时,发现内容DIV class 属性值是变化的,如 http://www.meishichina.com/News/HangYe/201111/109004.shtml 这个页面 的内容标签是这样的: <div class="content 109004"> xxxxx</div>和页面名称一起变化的,所以优化了一下 HTML解析工具类,虽然只是加了一小段代码,但是确实非常重要的,代码如下:
/**
* 组装过滤器
* @param key 键
* @param value 值,支持正则表达式
* @return 过滤器
*/
private NodeFilter populateFilter(final String key,final String value) {
NodeFilter filter;
if(SINGLE_TAG.equals(key)){
filter = new TagNameFilter(value);
}else{
filter = new HasAttributeFilter(){
public boolean accept(Node node) {
if(node instanceof CompositeTag){
CompositeTag tag = (CompositeTag)node;
//如果匹配 则返回TRUE
if(StringUtils.isNotEmpty(tag.getAttribute(key)) && tag.getAttribute(key).matches(value)){
return true;
}else{
return false;
}
}else{
return false;
}
}
};
}
return filter;
}
好了 ,现在基本上可以采集你想采集的任何内容了:)
采集效果 可以查看 :http://www.javacoo.org/
下面是参数设置界面截图和HTML解析器源码:
参数设置界面截图
HTML解析器源码
HtmlParserImpl.rar
|
|