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);
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章