HtmlParser 提供了强大的类库来处理 Internet 上的网页,可以实现对网页特定内容的提取和修改。
1.循环迭代所有节点
/**
* 迭代所有节点
* @param list
* @param keyword
*/
public static void processNodeList(NodeList list, String keyword){
SimpleNodeIterator iterator = list.elements();
while(iterator.hasMoreNodes()){
Node node = iterator.nextNode();
//得到该节点的子节点列表
NodeList childList = node.getChildren();
//孩子节点为空,说明是值节点
if(childList == null){
//得到值节点的值
String result = node.toPlainTextString();
//若包含关键字。则简单打印文本
if(result.indexOf(keyword) != -1){
System.out.println(result);
}
}
else {
processNodeList(childList,keyword);
}
}
}
2.过滤关键字
/**
* 循环访问所有节点,输出包含关键字的值节点
* @param url
* @param keyword
*/
public static void extractKeyWordText(String url, String keyword){
try{
//通过网页url生成一个解析器对象
Parser parser = new Parser(url);
//设置网页编码
parser.setEncoding("gb2312");
//迭代所有节点,不适用NodeFilter
NodeList list = parser.parse(null);
processNodeList(list,keyword);
}catch(Exception e){
e.printStackTrace();
}
}
过滤关键字为18,运行结果:
3.过滤标签
/**
* 获取一个网页上所有的链接和图片
* @param url
*/
public static void extracLinks(String url){
try{
Parser parser = new Parser(url);
parser.setEncoding("gb2312");
//过滤<frame>标签的filter
NodeFilter frameFilter = new NodeFilter(){
@Override
public boolean accept(Node node) {
if(node.getText().startsWith("frame src=")){
return true;
}
// TODO Auto-generated method stub
return false;
}
};
//OrFilter设置过滤<a><img><frame>标签,or关系
OrFilter orfilter = new OrFilter(new NodeClassFilter(LinkTag.class),new NodeClassFilter(ImageTag.class));
OrFilter linkfilter = new OrFilter(orfilter,frameFilter);
NodeList list = parser.extractAllNodesThatMatch(linkfilter);
for(int i = 0; i < list.size(); i ++){
Node tag = list.elementAt(i);
if(tag instanceof LinkTag){
LinkTag link = (LinkTag)tag;
String linkurl = link.getLink();// get url
String text = link.getLinkText();//链接文字
System.out.println("link :" + linkurl+ text);
}
else if(tag instanceof ImageTag){
ImageTag image = (ImageTag)tag;
String imageurl = image.getImageURL();
String text = image.getText();
System.out.println("image :" + image + text);
}
else{//<frame>
String frame = tag.getText();
int start = frame.indexOf("src=");
frame = frame.substring(start);
int end = frame.indexOf(" ");
if(end == -1){
end = frame.indexOf(">");
}
frame = frame.substring(5, end -1);
System.out.println("frame" + frame);
}
}
}catch(Exception e){
e.printStackTrace();
}
}
过滤<a><image><frame>运行结果:
4.利用StringBean来去掉所有标签只剩文本:
StringBean sb = new StringBean();
sb.setLinks(false);
sb.setURL(url);
System.out.println(sb.getStrings());
运行结果: