htmlparser页面解析(基础运用)

jkshangss 2012-08-06

Htmlparser简介

htmlparser是一个纯的java写的html解析的库,它不依赖于其它的java库文件,主要用于改造或

提取html。它能超高速解析html,而且不会出错。现在htmlparser最新版本为2.0。

基础运用

目标页面代码

<ul class="list_ul">
    <li class="title_li">1
    <a href="http://f.wanfangdata.com.cn/download/Periodical_zhfsbx98200105004.aspx" style="" title="全文" target="_blank" class="pdf_img"></a>
    <a href="http://d.wanfangdata.com.cn/Periodical_zhfsbx98200105004.aspx" style="display:none" title="文摘" target="_blank" class="abs_img"></a>
    [url=http://d.wanfangdata.com.cn/Periodical_zhfsbx98200105004.aspx]抗环瓜氨酸肽抗体检测在<font color="red">类风湿</font>关节炎中的意义[/url]        
    <span>(<t>被引用</t> 182 <t>次</t>)</span></li>
    <li class="greencolor">[<t>期刊论文</t>] [url=http://c.wanfangdata.com.cn/Periodical-zhfsbx98.aspx]《中华风湿病学杂志》[/url]
        <span>
            <span title="被中信所《中国科技期刊引证报告》收录">ISTIC</span>
            
            
            <span title="被北京大学《中文核心期刊要目总览》收录">PKU</span>
            
        </span>-[url=http://c.wanfangdata.com.cn/periodical/zhfsbx98/2001-5.aspx]2001年5期[/url]<a target="_blank" href="http://social.wanfangdata.com.cn/Locate.ashx?ArticleId=zhfsbx98200105004&amp;Name=%e6%9b%be%e5%b0%8f%e5%b3%b0">曾小峰</a><a target="_blank" href="http://social.wanfangdata.com.cn/Locate.ashx?ArticleId=zhfsbx98200105004&amp;Name=%e8%89%be%e8%84%89%e5%85%b4">艾脉兴</a><a target="_blank" href="http://social.wanfangdata.com.cn/Locate.ashx?ArticleId=zhfsbx98200105004&amp;Name=%e7%94%98%e6%99%93%e4%b8%b9">甘晓丹</a><a target="_blank" href="http://social.wanfangdata.com.cn/Locate.ashx?ArticleId=zhfsbx98200105004&amp;Name=%e5%8f%b2%e8%89%b3%e8%90%8d">史艳萍</a><a target="_blank" href="http://social.wanfangdata.com.cn/Locate.ashx?ArticleId=zhfsbx98200105004&amp;Name=%e5%ae%8b%e7%90%b4%e8%8a%b3">宋琴芳</a><a target="_blank" href="http://social.wanfangdata.com.cn/Locate.ashx?ArticleId=zhfsbx98200105004&amp;Name=%e5%94%90%e7%a6%8f%e6%9e%97">唐福林</a></li>
</ul>

目标解析上述页面代码,获取标签

[url=http://d.wanfangdata.com.cn/Periodical_zhfsbx98200105004.aspx]抗环瓜氨酸肽抗体检测在<font color="red">类风湿</font>关节炎中的意义[/url]

中的内容,通过htmlparser实现如下:

package com.nit.htmlparser.test;

import java.io.File;

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.TagNameFilter;
import org.htmlparser.util.NodeList;

public class Htmlparser {

	public static void main(String[] args) {
		File file = new File("E:\\JavaEE Work\\HtmlparserTest\\source.txt");//获取上述html代码
		try {
			Parser parser = new Parser(file.getAbsolutePath());
			parser.setEncoding("GBK");
                        //设置编码格式
			NodeFilter filter1 = new TagNameFilter("li");
			NodeFilter filter2 = new HasAttributeFilter("class","title_li");
			NodeFilter filter = new AndFilter(filter1,filter2);
			//设置页面过滤条件
			NodeList nodeList = parser.extractAllNodesThatMatch(filter);
                        //根据过滤条件解析页面
			Node node = nodeList.elementAt(0);
			String html = node.getChildren().toHtml();
                        //将抽取出来的信息转化为html再次解析
			filter1 = new HasAttributeFilter("target", "_blank");
			parser = Parser.createParser(html, "GBK");
			nodeList = parser.extractAllNodesThatMatch(filter1);
			System.out.println(nodeList.elementAt(2).getChildren().asString());
			filter2 = new TagNameFilter("span");
			parser = Parser.createParser(html, "GBK");
			nodeList = parser.extractAllNodesThatMatch(filter2);
			System.out.println(nodeList.elementAt(0).getChildren().asString());
		} catch (Throwable e) {
			e.printStackTrace();
		}
		
	}
}

代码解析:htmlparser的使用,首先在项目中导入htmlparser.jar包,然后创建Parser类,可用通过文件导入,String类型数据创建(Parserparser=newParser(file.getAbsolutePath());或parser=Parser.createParser(html,"GBK");)。

然后制定过滤规则。

标签过滤的方式有三种:

NodeFilterfilter1=newTagNameFilter("li");通过标签匹配需要需求的内容,本代码的意思就是匹配html标签为<li>的内容;

NodeFilterfilter2=newHasAttributeFilter("class","title_li");通过标签属性来匹配需求内容,本代码的意思是匹配html标签属性为class=title_li的内容;

NodeFilterfilter=newAndFilter(filter1,filter2);匹配符合filter1和filter2两个过滤要求的内容,可以通过这三种方式随意组合来精确定位目标文本内容,这三句代码组合过滤条件为匹配<liclass="title_li">的文本内容。

当发现获取的文本还不是十分符合需要获取内容的要求时,可以将文本还原为html代码后,再次进行匹配。

当通过过滤器获取到nodeList后,通过htmlparser接口能够获取匹配出来的html的父标签,子标签,兄弟标签及其自身文本等内容。附上内容获取的接口:

HTMLParser将解析过的信息留存为一个树的结构。Node是信息留存的数据类型基础。

请看Node的界说:

publicinterfaceNodeextendsCloneable;

Node中包括的要领有几类:

对付树型结构进行遍历的函数,这些函数最轻易理解:

NodegetParent():取得父节点

NodeListgetChildren():取得子节点的列表

NodegetFirstChild():取得第一个子节点

NodegetLastChild():取得最后一个子节点

NodegetPreviousSibling():取得前一个兄弟(欠好意思,英文是兄弟姐妹,直译太麻烦并且不相符习惯,抱歉女同胞了)

NodegetNextSibling():取得下一个兄弟节点

取得Node内容的函数:

StringgetText():取得文本

StringtoPlainTextString():取得纯文本信息。

StringtoHtml():取得HTML信息(原始HTML)

StringtoHtml(booleanverbatim):取得HTML信息(原始HTML)

StringtoString():取得字符串信息(原始HTML)

PagegetPage():取得这个Node对应的Page东西

intgetStartPosition():取得这个Node在HTML页面中的起始位置

intgetEndPosition():取得这个Node在HTML页面中的结束位置

用于Filter过滤的函数:

voidcollectInto(NodeListlist,NodeFilterfilter):基于filter的条件对付这个节点进行过滤,相符条件的节点放到list中。

用于Visitor遍历的函数:

voidaccept(NodeVisitorvisitor):对这个Node应用visitor

用于修改内容的函数,这类用得比较少:

voidsetPage(Pagepage):设置这个Node对应的Page东西

voidsetText(Stringtext):设置文本

voidsetChildren(NodeListchildren):设置子节点列表

其他函数:

voiddoSemanticAction():执行这个Node对应的操纵(只有少数Tag有对应的操纵)

Objectclone():接口Clone的抽象函数。

相关推荐