参考地址:http://hi.baidu.com/neverend06/blog/item/86ab838aa60dfc6c9f2fb4fe.html
HTMLParser遍历了网页的内容以后,以树(森林)结构保存了结果。HTMLParser访问结果内容的方法有两种。使用Filter和使用Visitor。
(一)Filter类
顾名思义,Filter就是对于结果进行过滤,取得需要的内容。HTMLParser在org.htmlparser.filters包之内一共定义了16个不同的Filter,也可以分为几类。
判断类Filter:
TagNameFilter
HasAttributeFilter
HasChildFilter
HasParentFilter
HasSiblingFilter
IsEqualFilter
逻辑运算Filter:
AndFilter
NotFilter
OrFilter
XorFilter
其他Filter:
NodeClassFilter
StringFilter
LinkStringFilter
LinkRegexFilter
RegexFilter
CssSelectorNodeFilter
所有的Filter类都实现了org.htmlparser.NodeFilter接口。这个接口只有一个主要函数:
boolean accept (Node node);
各个子类分别实现这个函数,用于判断输入的Node是否符合这个Filter的过滤条件,如果符合,返回true,否则返回false。
(二)判断类FilterHTMLParser使用入门(2)- Node内容
1:filter应用,TagNameFilter :
package html;
import java.net.HttpURLConnection;
import java.net.URL;
import org.htmlparser.Node;
import org.htmlparser.NodeFilter;
import org.htmlparser.Parser;
import org.htmlparser.filters.HasChildFilter;
import org.htmlparser.filters.LinkStringFilter;
import org.htmlparser.filters.NodeClassFilter;
import org.htmlparser.filters.StringFilter;
import org.htmlparser.filters.TagNameFilter;
import org.htmlparser.nodes.RemarkNode;
import org.htmlparser.util.NodeList;
public class TestHtmlparser {
//利用 Htmlparser 解析页面内容 用于过滤 页面敏感词 ,应用的时候先把客户端的url取到
public static void testTextExtractingVisitor(String url, String str) {
try {
URL l_url = new java.net.URL(url);
//建立连接
HttpURLConnection l_connection =(HttpURLConnection) l_url.openConnection();
//通过指定URLConnection对象创建Parser对象
Parser parser = new Parser(l_connection);
//StringFilter:查找字符串
// NodeFilter filter = new StringFilter(str); //把敏感词放入filter
//TagNameFilter 用于查看 标签
// NodeFilter filter = new TagNameFilter ("DIV");
//查找看有 该标签的 父标签
// NodeFilter innerFilter = new TagNameFilter ("DIV");
// NodeFilter filter = new HasChildFilter(innerFilter, true);
//NodeClassFilter用法
// NodeFilter filter = new NodeClassFilter(RemarkNode.class);
//LinkStringFilter用法
NodeFilter filter = new LinkStringFilter("www.hao123.com/");
//筛选出所有包含 敏感词 字符串的所有文本节点
NodeList nodes = parser.extractAllNodesThatMatch(filter);
if (nodes.size()>0) {
for (int i = 0; i < nodes.size(); i++) {
Node textnode = (Node) nodes.elementAt(i);
System.out.println("搜索结果="+ textnode.getText());
}
}
else System.out.println("没有找到结果");
} catch (Exception ex) {
ex.printStackTrace();
}
}
public static void main(String[] args) {
testTextExtractingVisitor("http://www.hao123.com/", "123");
}
}
2.2 HasChildFilter,例子见上面中的:
注意HasChildFilter还有一个构造函数:
public HasChildFilter (NodeFilter filter, boolean recursive)
如果recursive是false,则只对第一级子节点进行过滤。默认不写的时候是false
搜索结果=body
搜索结果=div id="diva"
搜索结果=div id="diva1"
如果recursive是true
搜索结果=html
搜索结果=body
搜索结果=div id="diva"
搜索结果=div id="diva1"
输出结果中多了一个html,这个是整个HTML页面的节点(根节点),虽然这个节点下直接没有DIV节点,但是它的子节点body下面有DIV节点,所以它也被匹配上了
2.3 HasAttributeFilter
HasAttributeFilter有3个构造函数:
public HasAttributeFilter ();
public HasAttributeFilter (String attribute);
public HasAttributeFilter (String attribute, String value);
调用方法1:
NodeFilter filter = new HasAttributeFilter();
NodeList nodes = parser.extractAllNodesThatMatch(filter);
输出结果:
什么也没有输出。
调用方法2:
NodeFilter filter = new HasAttributeFilter( "id" );
NodeList nodes = parser.extractAllNodesThatMatch(filter);
输出结果:
getText:div id="top_main"
=================================================
getText:div id="logoindex"
=================================================
调用方法3:
NodeFilter filter = new HasAttributeFilter( "id", "logoindex" );
NodeList nodes = parser.extractAllNodesThatMatch(filter);
输出结果:
getText:div id="logoindex"
(三)其他Filter:
3.1 NodeFilter filter = new NodeClassFilter(RemarkNode.class);
NodeList nodes = parser.extractAllNodesThatMatch(filter);
输出:搜索结果=
<link rel="stylesheet" type="text/css" href="styles.css">
3.2 StringFilter
这个Filter用于过滤显示字符串中包含制定内容的Tag。注意是可显示的字符串,不可显示的字符串中的内容(例如注释,链接等等)不会被显示。
3.3 LinkStringFilter
这个Filter用于判断链接中是否包含某个特定的字符串,可以用来过滤出指向某个特定网站的链接。
测试代码:
NodeFilter filter = new LinkStringFilter("www.hao123.com/");
//筛选出所有包含 敏感词 字符串的所有文本节点
NodeList nodes = parser.extractAllNodesThatMatch(filter);
输出结果:
搜索结果=a href="http://www.hao123.com/redian/tongzhi.htm"
搜索结果=a href=http://www.hao123.com/haoserver/wn.htm
(四)逻辑运算Filter:
HTMLParser支持对于简单类型的Filter进行组合,从而实现复杂的条件。原理和一般编程语言的逻辑运算是一样的
4.1 AndFilter可以把两种Filter进行组合,只有同时满足条件的Node才会被过滤。
测试代码:
NodeFilter filterID = new HasAttributeFilter( "id" );
NodeFilter filterChild = new HasChildFilter(filterA);
NodeFilter filter = new AndFilter(filterID, filterChild);
输出结果:
getText:div id="logoindex"
=================================================
4.2 OrFilter
把前面的AndFilter换成OrFilter
测试代码:
NodeFilter filterID = new HasAttributeFilter( "id" );
NodeFilter filterChild = new HasChildFilter(filterA);
NodeFilter filter = new OrFilter(filterID, filterChild);
输出结果:
getText:div id="top_main"
=================================================
getText:div id="logoindex"
=================================================
4.3 NotFilter
把前面的AndFilter换成NotFilter
测试代码:
NodeFilter filterID = new HasAttributeFilter( "id" );
NodeFilter filterChild = new HasChildFilter(filterA);
NodeFilter filter = new NotFilter(new OrFilter(filterID, filterChild));
4.4 XorFilter
把前面的AndFilter换成XorFilter
测试代码:
NodeFilter filterID = new HasAttributeFilter( "id" );
NodeFilter filterChild = new HasChildFilter(filterA);
NodeFilter filter = new XorFilter(filterID, filterChild);
输出结果:
getText:div id="top_main"