htmlparser

参考资料:

package com.myTest;

import org.htmlparser.Node;
import org.htmlparser.NodeFilter;
import org.htmlparser.Parser;
import org.htmlparser.filters.AndFilter;
import org.htmlparser.filters.HasAttributeFilter;
import org.htmlparser.filters.NodeClassFilter;
import org.htmlparser.filters.OrFilter;
import org.htmlparser.filters.TagNameFilter;
import org.htmlparser.tags.LabelTag;
import org.htmlparser.tags.OptionTag;
import org.htmlparser.tags.SelectTag;
import org.htmlparser.util.NodeList;
import org.htmlparser.util.ParserException;

public class MyTest {
	/*
	 * Node中包括的要领有几类: 
	 * 对付树型结构进行遍历的函数,这些函数最轻易理解:
	 *  Node getParent ():取得父节点 
	 *  NodeList getChildren ():取得子节点的列表 
	 *  Node getFirstChild ():取得第一个子节点 
	 *  Node getLastChild ():取得最后一个子节点
	 *  Node getPreviousSibling ():取得前一个兄弟(欠好意思,英文是兄弟姐妹,直译太麻烦并且不相符习惯,抱歉女同胞了) 
	 *  Node getNextSibling ():取得下一个兄弟节点 取得Node内容的函数: 
	 *  String getText ():取得文本 
	 *  String toPlainTextString():取得纯文本信息。 
	 *  String toHtml () :取得HTML信息(原始HTML) 
	 *  String toHtml (boolean verbatim):取得HTML信息(原始HTML) 
	 *  String toString ():取得字符串信息(原始HTML) 
	 *  Page getPage ():取得这个Node对应的Page东西 
	 *  int getStartPosition ():取得这个Node在HTML页面中的起始位置 
	 *  int getEndPosition ():取得这个Node在HTML页面中的结束位置
	 * 
	 * */
	
	/*
	 * 用于Filter过滤的函数: 
	 * void collectInto (NodeList list, NodeFilter filter):基于filter的条件对付这个节点进行过滤,相符条件的节点放到list中。 
	 * 用于Visitor遍历的函数: void accept (NodeVisitor visitor):对这个Node应用visitor 用于修改内容的函数,这类用得比较少:
	 * void setPage (Page page):设置这个Node对应的Page东西 
	 * void setText (String text):设置文本 
	 * void setChildren (NodeList children):设置子节点列表 其他函数:
	 * void doSemanticAction ():执行这个Node对应的操纵(只有少数Tag有对应的操纵)
	 * */
	
	
	/* 过滤规则。 
	 * 标签过滤的方式有三种: 
	 * 1),通过标签匹配需要需求的内容,如: NodeFilter filter1 = new TagNameFilter("li") 是匹配html标签为<li>的内容;
	 * 2),通过标签属性来匹配需求内容,如 NodeFilter filter2 = new HasAttributeFilter("class","title_li") 匹配html标签属性为class=title_li的内容; 
	 * 3),组合过滤 ,如 NodeFilter filter = new AndFilter(filter1,filter2);匹配符合filter1和filter2两个过滤要求的内容;
	 * 
	 * 可以通过这三种方式随意组合来精确定位目标文本内容,这三句代码组合过滤条件为匹配<li class="title_li" >的文本内容。 
	 * 当发现获取的文本还不是十分符合需要获取内容的要求时,可以将文本还原为html代码后,再次进行匹配。
	 * 当通过过滤器获取到nodeList后,通过htmlparser接口能够获取匹配出来的html的父标签,子标签,兄弟标签及其自身文本等内容。附上内容获取的接口:
	 * HTMLParser将解析过的信息留存为一个树的结构。Node是信息留存的数据类型基础。 
	*/
	//根据节点名字过滤
	public static void filterNode(){
        try {
			Parser parser = new Parser("E:\\aaa.html");
			parser.setEncoding("UTF-8");
			NodeFilter filter1 =new TagNameFilter("DIV");//过滤所有DIV节点(节点不区分大小写)
			NodeFilter fitler2= new HasAttributeFilter("class","wrapper");
			NodeFilter filter =new AndFilter(filter1,fitler2); //<div class="wrapper">
			//NodeList nodeList =parser.extractAllNodesThatMatch(filter1);//过滤所有DIV节点
			NodeList nodeList =parser.extractAllNodesThatMatch(filter);//含有class =wrapper 的DIV(子节点也会一起打印出来)
			for(int i=0;i<nodeList.size();i++){
				Node node =nodeList.elementAt(i);
				System.out.println(node.toHtml());//打印节点内容
			}
		} catch (ParserException e) {
			e.printStackTrace();
		}
	}
	
	/**
	 * 根据ID查找
	 * @param fileName
	 * @param elementId
	 * @return
	 * @throws ParserException
	 */
	public static Node findById(String fileName,String elementId) throws ParserException {
		Parser parser = new Parser(fileName);
		parser.setEncoding("UTF-8");
		NodeFilter TitleFilter = new NodeClassFilter(LabelTag.class);//InputTag,SpanTag,HeadTag,SelectTag,OptionTag.....
		NodeFilter ElementIdFilter = new HasAttributeFilter("id", elementId);
		OrFilter orFilter = new OrFilter(TitleFilter, ElementIdFilter);
		//OR Filter组合
		NodeList list =parser.parse(orFilter);// parser.extractAllNodesThatMatch(orFilter);
		return  list.elementAt(0);
	} 
	
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		try {
/*			InputTag node =(InputTag)findById("E:\\aaa.html","testNode");
			node.setAttribute("value", "value");//增加节点属性
			System.out.println(node.toHtml());*/
			
			SelectTag node =(SelectTag)findById("E:\\aaa.html","testNode3");
			//为Select增加Option
			NodeList children = new NodeList();
			OptionTag option1 =new OptionTag();
			option1.setValue("AA");
			OptionTag option2 =new OptionTag();
			option2.setValue("BB");
			children.add(option1);
			children.add(option2);
			node.setChildren(children);
			System.out.println(node.toHtml());
			
		
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

htmlparser完整源码下载

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值