網絡爬蟲(二)

    在咱們抓取到頁面以後,還須要對頁面進行解析。整個頁面都是字符串的形式,可使用字符串處理工具來解析頁面,也可使用正則表達式,但這些方法都會帶來很大的開發成本。因此咱們須要一款準們解析 html 頁面的工具。html

Jsoup

    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)
測試

    2.1. 測試代碼,解析URL

        @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

     2.2. 測試代碼,解析字符串

    @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);
    }

 

     2.3. 測試代碼,解析文件

    @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);
    } 

     3. 使用dom解析

    @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());
    }

     4. 從元素中獲取數據

    如:<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 > *:查找某個父元素下的全部直接子元素

相關文章
相關標籤/搜索