Java網路爬蟲(五)--使用Jsoup的select語法進行元素查詢
阿新 • • 發佈:2019-01-07
使用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);
}