1. 程式人生 > >Java網路爬蟲(五)--使用Jsoup的select語法進行元素查詢

Java網路爬蟲(五)--使用Jsoup的select語法進行元素查詢

使用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);
}