Jericho Html paser详解
Jericho Html parseAPI: http://jericho.htmlparser.net/docs/javadoc/index.html
在解析Html文档中第一步就是创建一个Source对象,该对象的构造方法如下:
Source(java.lang.CharSequence text) |
Source(java.io.File file) |
Source(java.io.InputStream inputStream) |
Source(java.io.Reader reader) |
Source(java.net.URL url) |
Source(java.net.URLConnection urlConnection) |
从上图可以看出,构造Source对象的源可以是String,InputStream,Reader,URL,URLConnection。当然,一般对从Internet上爬下来的html进行解析,使用Source(java.net.URL url)无疑是最方便的。
Element对象表示一个元素,包含有start tag,对应的end tag以及中间的内容部分。
如html文档:<p>This is a sample paragraph.</p>,整个表示一个Element.在这个Element中,包含 StartTag
"<p>
", , EndTag
"</p>
",还有中间的内容Thisis a sample paragraph.
同样,以下的<li>和</li>也是一个Element,该Element包含其他标签。
<li class="last"> | |
<div class="detail-frame"> | |
<h2> | |
大地上的事情 | |
</h2> | |
<p class="color-gray"> | |
苇岸 / 2014-6 / 广西师范大学出版社 / 37.00 / 平装 | |
</p> | |
<p> | |
苇岸把麦地、树林、冬日的小灰雀,连同自己质朴的生命一起带入太阳的光流。苇岸不仅安息在丰盛的麦地之中,也将永远活在金子一样闪耀的他的语言里,他的语言目击了创造。 | |
| |
</p> | |
</div> | |
<a href="http://book.douban.com/subject/25874670/"><img src="http://img5.douban.com/mpic/s27268628.jpg"/></a> | |
</li> |
可以通过以下方式获取Element对象:
Tag对象表示一个标签,在html中表示 StartTag
或者 EndTag
。
如html文档:<p>This is a sample paragraph.</p>中, "<p>
"表示 StartTag
对象,而 "</p>
"表示 EndTag
对象。StartTag
对象与对应的EndTag
对象以及中间的内容合起来就是Element对象。
Segement代表Source文档的一个段。构造方法如下:
Segment
(Source source, int begin,int end)
需要注意的是,Source,Element,Tag,Attribute这几个类都是Segement类的子类。注意,在Segement类中的方法
表示获取当前Segement对象中的所有文本数据。如在上面的html中,li标签的Element对象调用getTextExtractor()方法会打印出所有的文字。
Attribute代表属性,也就是在StartTag中的name/value值。如:
<H1 id="section1">
This is an identified heading thanks tothe id attribute
</H1>
id="section1" 就是Element的一个Attribute,可以通过方法Element对象的String getAttributeValue(java.lang.String attributeName)获取属性id的值sectionl。
get
(java.lang.String name)
方法获取到对应name的Attribute对象。
下面以一个实例说明基本的用法:
Html文档如下:
<div class="item" sku="11220393">
<dl class="info">
<dtclass="p-name">
<a target="_blank"href=http://item.jd.com/11220393.html title='高性能MySQL(第3版)' >
高性能MySQL(第3版)
</a>
</dt>
<ddclass="p-price">.
<divclass="dt">京东 价:</div>
<divclass="dd"><strong></strong><spanclass="discount"></span></div>
</dd>
<ddclass="p-market">
<divclass="dt">定  价:</div>
<divclass="dd"><del></del></div>
</dd>
<divclass="clr"></div>
</dl>
<ul class="summary">
<liclass="summary-author">
<divclass="dt">作  者:</div>
<divclass="dd">
<atarget="_blank" href="http://book.jd.com/writer/BaronSchwartz_1.html" target="_blank">Baron Schwartz</a>,<atarget="_blank" href="http://book.jd.com/writer/PeterZait..._1.html" target="_blank">Peter Zait...</a> 著 <atarget="_blank" href="http://book.jd.com/writer/宁海元_1.html"target="_blank">宁海元</a>,<a target="_blank"href="http://book.jd.com/writer/周振兴_1.html"target="_blank">周振兴</a>,<a target="_blank"href="http://book.jd.com/writer/彭立勋_1.html"target="_blank">彭立勋</a>,等译 </div>
</li>
<liclass="summary-press">
<divclass="dt">出版 社:</div>
<divclass="dd">
<atarget="_blank" href="http://book.jd.com/publish/电子工业出版社_1.html">电子工业出版社</a>
</div>
</li>
<liclass="summary-time">
<divclass="dt">出版时间:</div>
<div class="dd">2013年04月</div>
</li>
<liclass="summary-grade">
<divclass="dt">顾客评价:</div>
<divclass="dd"><span class="star"><spanclass="star-white"><span class="star-yellowh5"> </span></span></span><ahref="http://club.jd.com/review/11220393-1-1.html"target="_blank">(已有1125评价)</a></div>
</li>
<liclass="summary-service">
<divclass="dt">服  务:</div>
<divclass="dd">由京东 发货</div>
</li>
</ul>
<div class="clr"></div>
<div class="p-img">
<a target="_blank"href="http://item.jd.com/11220393.html" title="高性能MySQL(第3版)">
<imgdata-img="1"data-lazyload="http://img11.360buyimg.com/n2/g10/M00/17/1C/rBEQWFF00eMIAAAAAADX132P3PkAAEqmABYSIQAANfv613.jpg"width="160" height="160" alt="高性能MySQL(第3版)">
</a>
</div>
<div class="btns">
<a class="btn-graybtn-append" target="_blank"href="http://cart.jd.com/cart/dynamic/gate.action?pid=11220393&pcount=1&ptype=1">加入购物车</a>
<a class="btn-graybtn-coll" href="#none" id="coll11220393"οnclick="feed_publish_collect(2,11220393);">关注</a>
</div>
</div>
代码如下:
public static void main(String[] args)throws Exception {
int count=0;
URL url = new URL("http://list.jd.com/1713-3287-3799.html");
Source source = new Source(url);
List<Element> divList = source.getAllElements("div");
System.out.println(divList.size());
for(Element em:divList){
//得到div元素的属性, <div class="item"sku="11220393">,也就是class="item"sku="11220393"两个属性
Attributes attrs = em.getAttributes();
if(attrs.getCount()==2 &&"item".equals(attrs.get("class").getValue())){
List<Element> childs = em.getChildElements();
Element dl = childs.get(0);//获取Elementdl
Element ul = childs.get(1);//获取Elementul
//定位: <a target="_blank"href=http://item.jd.com/11220393.htmltitle='高性能MySQL(第3版)' >
String title = dl.getFirstElement("a").getAttributeValue("title");//得到书名
List<Element> lis = ul.getChildElements();
String writer =lis.get(0).getTextExtractor().toString();
// System.out.println(ul.getTextExtractor());//会打印出Element对象ul中的所有文字
String publisher =lis.get(1).getTextExtractor().toString();
String publishTime =lis.get(2).getTextExtractor().toString();
String evaluation =lis.get(3).getTextExtractor().toString();
System.out.println(title);
System.out.println(writer);
System.out.println(publisher);
System.out.println(publishTime);
System.out.println(evaluation);
}
}
}