在咱們抓取到頁面以後,還須要對頁面進行解析。整個頁面都是字符串的形式,可使用字符串處理工具來解析頁面,也可使用正則表達式,但這些方法都會帶來很大的開發成本。因此咱們須要一款準們解析 html 頁面的工具。html
jsoup是一款 java 的 HTML 解析器,可直接解析某個URL地址、HTML文本內容。它提供了一套很是省力的API,可經過DOM,CSS以及相似於jQuery的操做方法來取出和操做數據。java
主要功能:正則表達式
1. 從URL,文件或字符串中解析HTML;多線程
2. 使用DOM 或 CSS選擇器來查找、取出數據;dom
3. 可操做 HTML元素、屬性、文本(基本不使用)工具
1. 導入依賴座標(jsoup、commons-io、commons-lang3)
測試
@Test public void urlFun() throws Exception { // 解析URL地址,參數:訪問的url,訪問時的超時時間 Document doc = Jsoup.parse(new URL("http://112.124.1.187/"),10000); // 使用標籤選擇器 String title = doc.getElementsByTag("title").first().text(); System.out.println(title); }
ps: 這裏咱們能夠得出,Jsoup 能夠代替 HttpClient 直接發起請求數據。可是咱們每每不會這麼作,由於實際開發中,須要使用到多線程、鏈接池、代理等等,而 Jsoup 對這些的支持並非很好,因此咱們通常把 Jsoup 僅僅做爲 html 解析工具使用。url
@Test public void strFun() throws Exception { // 從文件獲取字符串 String content = FileUtils.readFileToString(new File("C:\\Users\\24360\\Desktop\\a.html"),"utf-8"); // 解析字符串 Document doc = Jsoup.parse(content); // 使用標籤選擇器 String title = doc.getElementsByTag("title").first().text(); System.out.println(title); }
@Test public void strFun() throws Exception { // 解析文件 Document doc = Jsoup.parse(new File("C:\\Users\\24360\\Desktop\\a.html"),"gbk"); // 使用標籤選擇器 String title = doc.getElementsByTag("title").first().text(); System.out.println(title); }
@Test public void domTest() throws IOException { // 解析文件,獲取Document對象 Document doc = Jsoup.parse(new File("C:\\Users\\24360\\Desktop\\a.html"),"gbk"); // 1.根據id獲取元素: getElementById Element element1 = doc.getElementById("header"); // System.out.println(element1.text()); // 2.根據標籤獲取元素: getElementsByTag Element element2 = doc.getElementsByTag("span").get(2); System.out.println(element2.text()); // 3.根據class獲取元素: getElementsByClass Element element3 = doc.getElementsByTag("class_a").get(0); System.out.println(element3.text()); // 4.根據屬性獲取元素: getElementsByAttribute Element element4 = doc.getElementsByTag("href").get(0); System.out.println(element4.text()); // 4.2 若是有多個屬性名相同的狀況,也能夠根據屬性-值 來獲取 Element element5 = doc.getElementsByAttributeValue("href","http://www.baidu.com").get(0); System.out.println(element5.text()); }
如:<a id="baidu" class="class_a class_b" href="http://www.baidu.com">百度</a>spa
@Test public void attrTest() throws IOException { // 解析文件,獲取Document對象 Document doc = Jsoup.parse(new File("C:\\Users\\24360\\Desktop\\a.html"),"gbk"); // 1.根據id獲取元素: getElementById Element ele = doc.getElementById("baidu"); // 元素中獲取數據 // 1.元素中獲取id String strId = ele.id(); System.out.println(strId); // baidu // 2.元素中獲取類名 String className = ele.className(); System.out.println("全部類名:" + className); // 全部類名:class_a class_b Set<String> classSet = ele.classNames(); for(String s : classSet){ // class_a class_b System.out.println(s); } // 3.元素中獲取對應屬性的值 String attr = ele.attr("href"); //http://www.baidu.com System.out.println(attr); // 4 獲取全部屬性 Attributes attrs = ele.attributes(); System.out.println(attrs.toString()); // id="baidu" class="class_a class_b" href="http://www.baidu.com" }
5.1 使用 Selector 選擇器
線程
tagname:經過標籤查找元素,例:span
#id:經過id查找元素,例:#group
.class:經過類名查找元素,例:.class_a
[attribute]:經過屬性查找元素,例:[abc]
[attr=value]:經過屬性值查找元素,例:[class=sn]
如:
<a id="baidu" class="class_a class_b" href="http://www.baidu.com">百度</a>
<div abc="123">屬性值</div>
@Test public void selectorTest() throws IOException { // 解析文件,獲取Document對象 Document doc = Jsoup.parse(new File("C:\\Users\\24360\\Desktop\\a.html"),"gbk"); // tagname:經過標籤查找元素,例:span Element e1 = doc.select("a").get(0); System.out.println(e1.text()); // 百度 // #id:經過id查找元素,例:#baidu Element e2 = doc.select("#baidu").get(0); System.out.println(e2.text()); // 百度 // .class:經過類名查找元素,例:.class_a Element e3 = doc.select(".class_a").get(0); System.out.println(e3.text()); // 百度 // [attribute]:經過屬性查找元素,例:[abc] Element e4 = doc.select("[abc]").get(0); System.out.println(e4.text()); // 屬性值 // [attr=value]:經過屬性值查找元素,例:[abc=123] Element e5 = doc.select("[abc=123]").get(0); System.out.println(e5.text()); // 屬性值 }
5.2 Selector 選擇器組合使用
el#id:元素+ID,例:h3#group
el.class:元素+類名,例:h3.class_a
el[attr]:元素+屬性名,例:span[abc]
任意組合:例:span[abc].class_a
ancestor child:查找某個元素下子元素,例:.class_a li,查找「.class_a」下的全部li
parent > child:查找某個父元素下的直接子元素(第一級)
parent > *:查找某個父元素下的全部直接子元素