使用dom方法来遍历一个Document对象


将HTML解析成一个Document之后,就可以使用类似于DOM的方法进行操作,抓取实例代码(目标:抓取百度新闻):


1522761607838076811.png

public static void main(String[] args) throws IOException {
  Document doc = Jsoup.connect("http://news.baidu.com/").get();
  Element ht = doc.getElementById("headline-tabs");//id 元素
  if(ht!=null){
    System.out.println(ht.text());
  }
  System.out.println("===================================获取指定class标签");
  /** 抓取热点要闻 **/
  Elements hots = doc.getElementsByClass("hotnews");//class 元素
  if(hots!=null && hots.size()>0){
    Element hot = hots.get(0);
    Elements as = hot.getElementsByTag("a");//标签 元素
    if(as!=null && as.size()>0){
      for(Element a:as){
        System.out.println(a.text());
      }
    }
  }
  System.out.println("===================================得到元素的兄弟元素。该元素本身不包含在内");
  Element siblingHtml = hots.first().siblingElements().first();//获取“兄弟”节点,这里我就演示获取第一个吧 .first()
  if(siblingHtml!=null){
    Elements as = siblingHtml.getElementsByTag("a");
    if(as!=null && as.size()>0){
      for(Element a:as){
        System.out.println(a.text());
      }
    }
  }
  System.out.println("===================================获取此元素的最后一个元素同级");
//    <div id="pane-news" class="mod-tab-pane active">
//      <div class="hotnews" alog-group="focustop-hotnews"></div>
//      <ul class="ulist focuslistnews"></ul>
//      <ul class="ulist focuslistnews"></ul>
//      <ul class="ulist focuslistnews"></ul>
//      <ul class="ulist focuslistnews">abc</ul>
//    </div>
  //获取此元素的第一个元素同级,如上所示,应该是abc的那一行
  //.firstElementSibling() 相反则是获取第一个同级元素
  Element fes = hots.first().lastElementSibling();
  if(fes!=null){
    Elements as2 = fes.getElementsByTag("a");
    if(as2!=null && as2.size()>0){
      for(Element a:as2){
        System.out.println(a.text());
      }
    }
  }
  System.out.println("===================================得到该元素的下一个兄弟元素");
  //得到该元素的下一个兄弟元素,和获取下一个“兄弟”节点类似
  //.previousElementSibling() 相反则是获取上一个兄弟元素
  Element fes1 = hots.first().nextElementSibling();
  if(fes1!=null){
    Elements as2 = fes1.getElementsByTag("a");
    if(as2!=null && as2.size()>0){
      for(Element a:as2){
        System.out.println(a.text());
      }
    }
  }
  System.out.println("===================================parent() 上级/父 节点");
//    <div class="hotnews" alog-group="focustop-hotnews">
//     <ul>
//      <li class="hdline0"></li>
//      <li class="hdline1"></li>
//      <li class="hdline2"></li>
//      <li class="hdline3"></li>
//      <li class="hdline4"></li>
//      <li class="hdline5"></li>
//     </ul>
//    </div>
  Element hdline = doc.getElementsByClass("hdline5").first();
  if(hdline!=null){
    System.out.println(hdline.parent().parent().attr("class"));
  }
  System.out.println("===================================children() 下级/子 节点");
//    <div class="hotnews" alog-group="focustop-hotnews">
//     <ul>
//      <li class="hdline0"></li>
//      <li class="hdline1"></li>
//      <li class="hdline2"></li>
//      <li class="hdline3"></li>
//      <li class="hdline4"></li>
//      <li class="hdline5"></li>
//     </ul>
//    </div>
  Element hotnews = doc.getElementsByClass("hotnews").first();
  if(hotnews!=null){
    System.out.println(hotnews.children().first().child(2).className());//这样获取到的就是第二个 li 子元素
  }
  
//    System.out.println("===================================nodeName()、tagName()");
//    Element hotnews2 = doc.getElementsByClass("hotnews").first();
//    System.out.println(hotnews2.nodeName());//到节点名
//    System.out.println(hotnews2.tagName());//得到元素的标签名 如div
//    hotnews2.tagName("p");//
//    System.out.println(hotnews2.tagName());//得到元素的标签名 如div
  
  System.out.println("===================================获取指定class标签");
  Elements hots2 = doc.getElementsByAttributeValue("class","hotnews");//寻找属性为指定值的元素。不区分大小写
  if(hots2!=null && hots2.size()>0){
    Element hot = hots.get(0);
    Elements as = hot.getElementsByTag("a");//标签 元素
    if(as!=null && as.size()>0){
      for(Element a:as){
        System.out.println(a.text());
      }
    }
  }
}

运行上面代码,输出以下结果:

热点要闻
===================================获取指定class标签
习近平为何如此重视这件事
习近平引用的从政箴言
归去来兮——追忆天宫一号
央视快评
跟总书记一起“做种树者”
收获美丽中国
海南:增绿护蓝 念好绿色发展山海经
潮起海之南
脱贫攻坚抓关键
为了民族复兴 英雄烈士谱
===================================得到元素的兄弟元素。该元素本身不包含在内
清明假期出游做足三门“功课”
2018年清明节
商务部:如果有人坚持打“贸易战”,我们奉陪到底
银保监会:保险保障基金为安邦增资608亿
央行:三方面举措打好防范化解金融风险攻坚战
林业局:开展专项行动 打击生态区毁林开垦等行为
北京今年超6.3万人报名高考 高招取消5类加分项目
===================================获取此元素的最后一个元素同级
清明将至 西双版纳祭扫尚勇镇烈士陵园132名英烈
日本外相晒"书法"引争议 网友:跟蚯蚓爬的似的
男子后备箱盗窃95万元现金 几天全赌光获刑11年
北京发布暴雪预警
毛泽东题词的英雄都是谁?
西安现"代扫墓":1次100元 直播10分钟并拍照片
《歌手》总导演洪涛被曝离职湖南卫视 申请已获批
===================================得到该元素的下一个兄弟元素
清明假期出游做足三门“功课”
2018年清明节
商务部:如果有人坚持打“贸易战”,我们奉陪到底
银保监会:保险保障基金为安邦增资608亿
央行:三方面举措打好防范化解金融风险攻坚战
林业局:开展专项行动 打击生态区毁林开垦等行为
北京今年超6.3万人报名高考 高招取消5类加分项目
===================================parent() 上级/父 节点
hotnews
===================================children() 下级/子 节点
hdline2
===================================获取指定class标签
习近平为何如此重视这件事
习近平引用的从政箴言
归去来兮——追忆天宫一号
央视快评
跟总书记一起“做种树者”
收获美丽中国
海南:增绿护蓝 念好绿色发展山海经
潮起海之南
脱贫攻坚抓关键
为了民族复兴 英雄烈士谱


说明


Elements这个对象提供了一系列类似于DOM的方法来查找元素,抽取并处理其中的数据。

请到 Element类方法详解