当前位置: 首页 > 工具软件 > Jericho > 使用案例 >

Jericho Html paser详解

宗烨赫
2023-12-01

Jericho Html paser详解

Jericho Html parseAPI: http://jericho.htmlparser.net/docs/javadoc/index.html

 

1:Source

在解析Html文档中第一步就是创建一个Source对象,该对象的构造方法如下:

Source(java.lang.CharSequence text) 
          Constructs a new Source object from the specified text.

Source(java.io.File file) 
          Constructs a new Source object by loading the content from the specified File.

Source(java.io.InputStream inputStream) 
          Constructs a new Source object by loading the content from the specified InputStream.

Source(java.io.Reader reader) 
          Constructs a new Source object by loading the content from the specified Reader.

Source(java.net.URL url) 
          Constructs a new Source object by loading the content from the specified URL.

Source(java.net.URLConnection urlConnection) 
          Constructs a new Source object by loading the content from the specified URLConnection.

从上图可以看出,构造Source对象的源可以是String,InputStream,Reader,URL,URLConnection。当然,一般对从Internet上爬下来的html进行解析,使用Source(java.net.URL url)无疑是最方便的。

 

2: Element

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对象:

 

3:Tag

Tag对象表示一个标签,在html中表示 StartTag 或者 EndTag

如html文档:<p>This is a sample paragraph.</p>中, "<p>"表示 StartTag 对象,而 "</p>"表示 EndTag 对象。StartTag 对象与对应的EndTag 对象以及中间的内容合起来就是Element对象。

4:Segement

Segement代表Source文档的一个段。构造方法如下:

Segment(Source source, int begin,int end) 

需要注意的是,Source,Element,Tag,Attribute这几个类都是Segement类的子类。注意,在Segement类中的方法

 TextExtractor

getTextExtractor() 

表示获取当前Segement对象中的所有文本数据。如在上面的html中,li标签的Element对象调用getTextExtractor()方法会打印出所有的文字。

5:Attribute

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。

 

6:Attributes

代表Attribute的list.可以通过Element对象的getAttributes() 方法获取。如:

<div id="db-nav-book" class="nav">,里面有两个Attribute. 可以通过Attributes对象的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">定&#12288;&#12288;价:</div>

                    <divclass="dd"><del></del></div>

                </dd>               

                <divclass="clr"></div>

           </dl>

           <ul class="summary">

                <liclass="summary-author">

                    <divclass="dt">作&#12288;&#12288;者:</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">&nbsp;</span></span></span><ahref="http://club.jd.com/review/11220393-1-1.html"target="_blank">(已有1125评价)</a></div>

                </li>

               <liclass="summary-service">

                        <divclass="dt">服&#12288;&#12288;务:</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);

        }

      }

   }

 类似资料: