天天看點

4.1 Jsoup解析

在上一章介紹了如何使用Jsoup擷取網頁資源,本節将重點介紹Jsoup的解析功能。Jsoup依賴于CSS選擇器與jQuery方法來操作HTML檔案中的資料。使用Jsoup解析前,需要了解Node、Element和Document的概念以及CSS選擇器、Jsoup擷取元素和Jsoup擷取元素文本的方法。

1.Node、Element和Document簡介

節點(Node):HTML檔案中所包含的内容都可以看成一個節點。節點有很多種類型,如屬性節點(Attribute)、注釋節點(Node)、文本節點(Text)和元素節點(Element)等。解析檔案的過程,實際上就是對節點操作的過程。

元素(Element):節點的子集,是以一個元素也是一個節點。

文檔(Document):整個HTML文檔的源碼内容。

2.CSS選擇器

CSS(Cascading Style Sheets),即層疊樣式表,主要用于HTML文檔的樣式化與布局,具體涉及字型、顔色、編輯和進階定位。CSS Selector,即CSS選擇器,是用于比對元素(Elements)的一種模式。在網絡爬蟲中,常使用CSS選擇器,定位HTML文檔中的元素,進而抽取HTML文檔中的相應字段。下面介紹,chrome浏覽器擷取元素Selector的方法。首先,按F12打開chrome的開發者工具,點選工具左上角箭頭的圖示,然後移動滑鼠到目标元素的上,此時工具上會高亮被選中的元素,點選右鍵選擇Copy下的Copy selector即可。

3.Jsoup擷取元素的常用方法

方法 描述
Elements getElementsByTag(String tagName) 基于标簽名稱擷取元素集合
Element getElementById(String id) 基于id擷取元素
Elements getElementsByClass(String className) 基于類名稱擷取元素集合
Elements getElementsByAttribute(String key) 基于屬性名稱擷取元素集合
Elements getElementsByAttributeValue(String key, String value) 基于屬性值擷取元素集合
Elements children() 擷取子元素集合
Elements siblingElements() 擷取兄弟元素集合
Element nextElementSibling() 擷取下一個兄弟元素
Element previousElementSibling() 擷取上一個兄弟元素
Element firstElementSibling() 擷取第一個兄弟元素
Element lastElementSibling() 擷取最後一個兄弟元素

4.Jsoup擷取元素文本的常用方法

方法 描述
String text() 元素的所有文本資訊
String ownText() 文本節點的資訊
List childNodes() 擷取孩子節點集合
List textNodes() 擷取文本節點的集合
程式4-1
public class Jsoup {
    public static void main(String[] args) {
        String pStr = "<p>One <span>Two</span> Three <br> Four</p>";
        Document document = Jsoup.parse(pStr);
        Element p = document.getElementsByTag("p").get(0);
        //text() 輸出:One Two Three Four
        System.out.println("text()方法輸出:" + p.text());

        //ownText() 輸出:One Three Four
        System.out.println("ownText()方法輸出:" + p.ownText());

        //children() 輸出:<span>Two</span> <br>
        Elements children = p.children();
        System.out.println("children()方法輸出:" + children.toString());

        //childNodes() 輸出:[One , <span>Two</span>,  Three , <br>,  Four]
        List<Node> nodeList = p.childNodes();
        System.out.println("childNodes()方法輸出:" + nodeList.toString());
        //textNodes() 輸出:[One ,  Three ,  Four]
        List<TextNode> textNodeList = p.textNodes();
        System.out.println("textNodes()方法輸出:" + textNodeList);
    }
}      

程式運作結果如下圖所示。

4.1 Jsoup解析

5.周遊元素

//程式4-2
public class Jsoup {
    public static void main(String[] args) {
        String str = "<ul>\n" +
                "\t<li>Spring</li>\n" +
                "\t<li>SpringBoot</li>\n" +
                "\t<li>SpringCloud</li>\n" +
                "</ul>";
        Document document = Jsoup.parse(str);
        Elements liElements = document.getElementsByTag("li");
        for(Element element:liElements){
            System.out.println(element.text());
        }
    }
}      

繼續閱讀