日期:2014-05-17  浏览次数:20632 次

htmlparser获取循环节点内容和单个标签内容的方法
htmlparser接口可用于提取分析html页面的内容。
本文只简单说明下如何利用htmlparser获取某个节点标签的内容,和获取循环节点的列表内容的个人总结。其它操作方法,因网上已经有很多相关的帮助文档,在此不再重复说明。

大致思路:
1:定义org.htmlparser.filters的类型,确定需要获取的标签或内容范围。常用的HMLT filter类型有:AndFilter、HasAttributeFilter、HasChildFilter、HasParentFilter、LinkStringFilter、NotFilter、OrFilter、TagNameFilter等类型。
为了更好定位所需要查找的页面内容,可以用多个Filter进行组合定位,如:AndFilter andFilter = new AndFilter(tagFilter,hasChildFilter);

2:通过NodeList list = parser.extractAllNodesThatMatch(andFilter);获取满足条件的节点列表。

3:对列表list进行循环遍历,在各个遍历里面,可以获取分析多个不同节点的内容,如获取某循环节点的内容和链接:
for(int i=0;i html = list.elementAt(i).toHtml();
// 获取内容
TagNameFilter pFilter = new TagNameFilter(\"p\");
HasAttributeFilter pAttributeFilter = new HasAttributeFilter(\"class\",\"sms\");
AndFilter pAndFilter = new AndFilter(pFilter,pAttributeFilter);
pParser = Parser.createParser(html, charset);
pList = pParser.extractAllNodesThatMatch(pAndFilter);
System.out.println(\"content:\"+pList.elements().nextNode().toPlainTextString());

// 获取连接
TagNameFilter aFilter = new TagNameFilter(\"a\");
HasChildFilter aChildFilter = new HasChildFilter(new TagNameFilter(\"strong\"));
AndFilter aAndFilter = new AndFilter(aFilter,aChildFilter);
pParser.reset();
pList = pParser.extractAllNodesThatMatch(aAndFilter);
// System.out.println(\"url:\"+pList.elements().nextNode().toHtml());
LinkTag linkTag = (LinkTag)pList.elements().nextNode();
System.out.println(\"url's link:\"+linkTag.getLink());
System.out.println(\"url's content:\"+linkTag.getLinkText());
}
至此,循环列表的内容,已经能全部获取到。
4:针对各种HMLT标签,htmlparser提供了各类标签的接口,为各类标签提供了各自个性化的方法,以便开发者更好更方便的调用。
举例如下:
如果想对某链接标签www.xxx.com\" class=\"xxx\">进行内容的提取,可以通过正则表达式或字符串处理来获取到自己想要的内容。但更方便的,可以通过各种相应的xxxTag接口进行处理。如:LinkTag linkTag = (LinkTag)pList.elements().nextNode();
System.out.println(\"url's link:\"+linkTag.getLink());
System.out.println(\"url's content:\"+linkTag.getLinkText();

5:具体htmlparser的API,参见官方文档:http://htmlparser.sourceforge.net/javadoc/

6:以上只是个人使用htmlparser的一个小小总结,欢迎交流。