HTMLParser的filter访问方式详解

来源:互联网 发布:智多星水利造价软件 编辑:程序博客网 时间:2024/06/05 05:24

参考地址: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"

原创粉丝点击