使用Jsoup進行元素的查找有兩種方法。有使用DOM方法來遍歷一個文檔,也有使用選擇器語法來查找元素,而後者類似於CSS或jQuery的語法來查找和操作元素。對於這兩個方法到底使用哪個感覺好上手我覺得因人而異,在我嘗試了兩種方法之後我還是選擇select,所以我就只總結select的語法使用了,對於DOM方法感興趣的,可以看一下這一篇博客:【使用JSOUP實現網絡爬蟲】使用DOM方法來遍歷一個文檔,看之前最好先了解一下Java網絡爬蟲–HTML DOM(HTML 基礎)。
select詳解
Document 繼承自 Element 類。select方法將返回一個Elements集合。
1.通過標籤名來查找:
測試代碼:
<span>33</span>
<span>25</span>
select寫法:
Elements elements = document.select("span");
下面的例子都按照上面的格式來寫,就不進行重複的標註了。
2.通過id來查找:
<span id=\"mySpan\">36</span>
<span>20</span>
Elements elements = document.select("#mySpan");
//通過id來查找,使用方法跟css指定元素一樣,用#
3.通過class名來查找:
<span class="myClass">36</span>
<span>20</span>
Elements elements = document.select(".myClass");
//使用方法跟css指定元素一樣,用.
4.利用標籤內屬性名查找元素:
<span class="class1" id="id1">36</span>
<span class="class2" id="id2">36</span>
Elements elements = document.select("span[class=class1]span[id=id1]");
//規則爲 標籤名【屬性名=屬性值】,多個屬性即多個【】,如上
5.利用標籤內屬性名前綴查找元素:
<span class="class1" >36</span>
<span class="class2" >22</span>
Elements elements = document.select("span[^cl]");
//規則爲 標籤名【^屬性名前綴】,多個屬性即多個【】
6.利用標籤內屬性名+正則表達式查找元素
對正則表達式不瞭解的同學下去一定要學習正則表達式哦,因爲它在爬蟲中可是很重要的。
<span class="ABC" >36</span>
<span class="ADE" >22</span>
Elements elements = document.select("span[class~=^AB]");
//規則爲 標籤名【屬性名~=正則表達式】,以上的正則表達式的意思是查找class值以AB爲開頭的標籤
7.利用標籤文本包含某些內容來查找:
<span>36</span>
<span>22</span>
Elements elements = document.select("span:contains(3)");
//規則爲 標籤名:contains(文本值)
8.利用標籤文本包含某些內容+正則表達式來查找:
<span>36</span>
<span>22</span>
Elements elements = document.select("span:matchesOwn(^3)");
//規則爲 標籤名:matchesOwn(正則表達式),以上的正則表式的意思是以文本值以3爲開頭的標籤
當然select還有其他強大的功能,如果對select感興趣的同學可以查看select API,我只是列出了獲取網頁特定內容所需要的select的基本語法,基本上對於大部分的爬蟲需求來說已經足夠了。
下來給大家展示一個使用select獲取特定元素值的代碼:
public class SelectDemo {
public static void test(String html) {
//採用Jsoup解析
Document doc = Jsoup.parse(html);
//System.out.println(html);
//獲取html標籤中的內容
Elements elements = doc.select("ul[class=gl-warp clearfix]")
.select("li[class=gl-item]");
for (Element ele : elements) {
String JdbookID = ele.attr("data-sku");
//out.println(JdbookID);
}
}
}
上面的代碼是我爬京東圖書提取圖書的id的部分截取,可以看到select的用法與前面講的沒有什麼區別。對於Element 這個類來說,如果我們要獲取一個標籤中的屬性值或文本內容可以這樣來做:
for (Element ele : elements) {
String JdbookID = ele.attr("data-sku"); //獲取data-sku的屬性值
//out.println(JdbookID);
String text = ele.text(); //獲取當前標籤(元素)的文本值
//out.println(text);
}