1. 程式人生 > >Jsoup文件--提取資料(使用選擇器語法查詢元素)

Jsoup文件--提取資料(使用選擇器語法查詢元素)

使用選擇器語法查詢元素

問題

想要使用類似於CSS或jQuery的選擇器語法查詢和操作元素。

解決方案

使用Element.select(String selector)Elements.select(String selector)方法:

File input = new File("/temp/input.html");
Document doc = Jsoup.parse(input, "UTF-8", "http://example.com/");

Elements links = doc.select("a[href]");
Elements pngs = doc.select("img[src$=.png]");

Element masthead = doc.select("div.masthead").first();

Elements resultLinks = doc.select("h3.r > a");

描述

jsoup elements物件支援類似於CSS或jQuery的選擇器語法來查詢匹配的元素,允許非常強大和健壯的查詢。 select方法可以被使用到DocumentElementElements物件中,它是上下文相關的,所以可以用來過濾出指定元素,或是鏈式呼叫進行選擇元素。 select返回Elements集合,並提供一系列方法來提取和操作資料。

Selector概述

  • tagname: 通過標籤來查詢元素,e.g. ap
  • ns|tag: 通過名稱空間下標籤查詢元素,e.g. 使用fb|name來查詢<fb:name>元素
  • #id: 通過ID查詢元素,e.g. #logo
  • .class: 通過class名稱查詢元素,e.g. .masthead
  • [attribute]: 利用屬性查詢元素,e.g. [href]
  • [^attr]: 利用屬性名字首來查詢元素,e.g. 使用[^data-]來查詢帶有HTML5 Dataset屬性的元素
  • [attr=value]: 利用屬性值來查詢元素,e.g. [width=500]
  • [attr^=value], [attr$=value], [attr*=value]: 利用匹配屬性值開頭、結尾或包含屬性值來查詢元素,e.g. [href*=/path/]
  • [attr~=regex]: 利用屬性值匹配正則表示式來查詢元素,e.g. img[src~=(?i)\.(png|jpe?g)]
  • *: 這個符號將匹配所有元素

組合選擇器

  • el#id: 元素+ID, e.g. div#logo
  • el.class: 元素+class, e.g. div.masthead
  • el[attr]: 元素+屬性名稱, e.g. a[href]
  • 任意組合,e.g. a[href].highlight
  • ancestor child: 祖先元素下的所有子元素, e.g. .body p 查詢pbody樣式的元素下的所有p元素
  • parent > child: 父級元素下的所有直接子元素(一級子元素), e.g. div.content > p 查詢div下的所有p元素;body > * body下的所有直接子元素(一級子元素)
  • siblingA + siblingB: 查詢A元素之前的第一個同級B元素,e.g. div.head + div
  • siblingA ~ siblingX: 查詢A元素之前的同級X元素,e.g. h1 ~ p
  • el, el, el: 多選擇器,查詢匹配任一選擇器的元素,e.g. div.masthead, div.logo

偽類選擇器

  • :lt(n): 查詢索引值 (i.e. 位於DOM樹中相對於其父級元素的位置)小於n的同級元素,e.g. td:lt(3)
  • :gt(n):查詢索引值大於n的同級元素,e.g. div p:gt(2)
  • :eq(n): 查詢索引值等於n的同級元素,e.g. form input:eq(1)
  • :has(selector): 查詢包含‘指定選擇器匹配到元素’的元素,e.g. div:has(p)
  • :not(selector): 查詢與指定選擇器不匹配的元素,e.g. div:not(.logo)
  • :contains(text): 查詢包含給定文字的元素,搜尋時對大小寫不敏感,e.g. p:contains(jsoup)
  • :containsOwn(text): 查詢直接包含(即元素本身包含而不包括子類元素)給定文字的元素
  • :matches(regex): 查詢包含與指定正則表示式相匹配文字的元素,e.g. div:matches((?i)login)
  • :matchesOwn(regex): 查詢直接包含(即元素本身包含而不包括子類元素)與指定正則表示式相匹配文字的元素,
  • 注意:上述偽類選擇器中的索引是從0開始的,第一個元素的索引是0,第二個元素的索引是1,以此類推… 可以參閱Selector API來檢視完整的支援列表和詳細資訊。