在上一章介紹了如何使用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);
}
}
程式運作結果如下圖所示。

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