使用dom方法来遍历一个Document对象
将HTML解析成一个Document之后,就可以使用类似于DOM的方法进行操作,抓取实例代码(目标:抓取百度新闻):
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类方法详解