参考资料:
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完整源码下载