Jsoup 數據抽取

數據抽取

1 使用DOM方法來遍歷一個文檔

有一個HTML文檔要從中提取數據,並瞭解這個HTML文檔的結構。將HTML解析成一個Document以後,就可使用相似於DOM的方法進行操做。css

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

Element content = doc.getElementById("content");
Elements links = content.getElementsByTag("a");
for (Element link : links) {
  String linkHref = link.attr("href");
  String linkText = link.text();
}

說明 :Elements這個對象提供了一系列相似於DOM的方法來查找元素,抽取並處理其中的數據。html

1.1查找元素

屬性java

操做 含義
getElementById(String id) id
getElementsByTag(String tag) 標籤名
getElementsByClass(String className) class名
getElementsByAttribute(String key)
siblingElements() 全部的兄弟元素
firstElementSibling() 第一個兄弟元素
lastElementSibling() 最後一個兄弟元素
nextElementSibling() 下一個兄弟元素
previousElementSibling() 上一個兄弟元素
parent() 獲取該元素父節點
children() 獲取該元素的子元素
child(int index) 獲取該元素的第幾個子元素(下標從0開始)

1.2 元素數據

操做 含義
attr(String key) 獲取屬性
attr(String key, String value) 設置屬性
attributes() 獲取全部屬性
id() 獲取該元素id
className() 獲取該元素class,多個class之間空格隔開
classNames() 獲取全部元素的class
text() 獲取文本內容
text(String value) 設置文本內容
html() 獲取元素內HTML
html(String value) 設置元素內的HTML內容
outerHtml() 獲取元素外HTML內容
data() 獲取數據內容(例如:script和style標籤)
tag()  
tagName() 獲取元素標籤名

1.3 操做HTML和文本

操做 含義
append(String html) 添加給定的html到元素末尾
prepend(String html) 添加給定html到元素前面
appendText(String text) 建立並添加文本
prependText(String text) 建立並添加文本
appendElement(String tagName) 添加到元素末尾
prependElement(String tagName) 添加到元素前
html(String value) 設置元素值

2 使用選擇器語法來查找元素(select)

使用 Element.select(String selector) 和 Elements.select(String selector),使用相似於CSS或jQuery的語法來查找和操做元素。node

File input = new File("/tmp/input.html");
    Document doc = Jsoup.parse(input, "UTF-8", "http://example.com/");
    Elements links = doc.select("a[href]"); //帶有href屬性的a元素
    Elements pngs = doc.select("img[src$=.png]"); //擴展名爲.png的圖片
    Element masthead = doc.select("div.masthead").first();//class等於masthead的div標籤
    Elements resultLinks = doc.select("h3.r > a"); //在h3元素以後的a元素

說明: 
jsoup elements對象支持相似於CSS (或jquery)的選擇器語法,來實現很是強大和靈活的查找功能。Select在DocumentElement,或Elements 對象中均可以使用。且是上下文相關的,所以可實現指定元素的過濾,或者鏈式選擇訪問。Select方法將返回一個Elements 集合,並提供一組方法來抽取和處理結果jquery

2.1 Select 選擇器 簡單用法

操做 含義
tagname 使用標籤名來定位,例如 a
ns|tag 使用命名空間的標籤訂位,例如 fb:name 來查找 <fb:name> 元素
#id 使用元素 id 定位,例如 #logo
.class 使用元素的 class 屬性定位,例如 .head
[attribute] 使用元素的屬性進行定位,例如 [href] 表示檢索具備 href 屬性的全部元素
[^attr] 使用元素的屬性名前綴進行定位,例如 [^data-] 用來查找 HTML5 的 dataset 屬性
[attr=value] 使用屬性值進行定位,例如 [width=500] 定位全部 width 屬性值爲 500 的元素
[attr^=value], [attr$=value], [attr*=value] 利用匹配屬性值開頭、結尾或包含屬性值來查找元素,好比:[href*=/path/]
[attr~=regex] 利用屬性值匹配正則表達式來查找元素,例如img[src~=(?i).(png|jpe?g)]
* 定位全部元素

2.2 Selector選擇器 組合使用

操做 含義
el#id 定位 id 值某個元素,例如 a#logo -> <a id=logo href= … >
el.class 定位 class 爲指定值的元素,例如 div.head -> <div class=head>xxxx</div>
el[attr] 定位全部定義了某屬性的元素,例如 a[href]
以上三個任意組合 例如 a[href]#logo 、a[name].outerlink
ancestor child 查找某個元素下子元素,好比:能夠用.body p 查找在"body"元素下的全部 p元素
parent > child 查找某個父元素下的直接子元素,好比:能夠用div.content > p 查找 p 元素,也能夠用body > * 查找body標籤下全部直接子元素
siblingA + siblingB 查找在A元素以前第一個同級元素B,好比:div.head + div
siblingA ~ siblingX 查找A元素以前的同級X元素,好比:h1 ~ p
el, el, el 多個選擇器組合,查找匹配任一選擇器的惟一元素,例如:div.masthead, div.logo

2.3 僞選擇器selectors (表達式)

操做 含義
:lt(n) 查找哪些元素的同級索引值(它的位置在DOM樹中是相對於它的父節點)小於n,好比:td:lt(3) 表示小於三列的元素
:gt(n) 查找哪些元素的同級索引值大於n``,好比: div p:gt(2)表示哪些div中有包含2個以上的p元素
:eq(n) 查找哪些元素的同級索引值與n相等,好比:form input:eq(1)表示包含一個input標籤的Form元素
:has(seletor) 查找匹配選擇器包含元素的元素,好比:div:has(p)表示哪些div包含了p元素
:not(selector) 查找與選擇器不匹配的元素,好比: div:not(.logo) 表示不包含 class=logo 元素的全部 div 列表
:contains(text) 查找包含給定文本的元素,不區分大不寫,好比: p:contains(jsoup)
:containsOwn(text) 查找文本信息徹底等於指定條件的元素
:matches(regex) 使用正則表達式進行文本過濾:div:matches((?i)login)
:matchesOwn(regex) 使用正則表達式找到自身的文本

3 從元素抽取屬性,文本和HTML

操做 含義
Node.attr(String key)  獲取屬性值
Element.text()  獲取元素中的文本值
Element.html()  獲取元素HTML內容
Node.outerHtml()  獲取元素HTML內容

使用css3

String html = "<p>An <a href='http://example.com/'><b>example</b></a> link.</p>";
Document doc = Jsoup.parse(html);//解析HTML字符串返回一個Document實現
Element link = doc.select("a").first();//查找第一個a元素

String text = doc.body().text(); // "An example link"//取得字符串中的文本
String linkHref = link.attr("href"); // "http://example.com/"//取得連接地址
String linkText = link.text(); // "example""//取得連接地址中的文本

String linkOuterH = link.outerHtml(); 
    // "<a href="http://example.com"><b>example</b></a>"
String linkInnerH = link.html(); // "<b>example</b>"//取得連接內的html內容

4.處理URLs

   有一個包含相對URLs路徑的HTML文檔,須要將這些相對路徑轉換成絕對路徑的URLs。正則表達式

  1. 在解析文檔時確保有指定baseURI
  2. 而後使用abs屬性性前綴來取得包含baseURI的絕對路徑
Document doc = Jsoup.connect("http://www.open-open.com").get();

Element link = doc.select("a").first();
String relHref = link.attr("href"); // == "/"
String absHref = link.attr("abs:href"); // "http://www.open-open.com/"

說明: 
在HTML元素中,URLs常常寫成相對於文檔位置的相對路徑: <a href="/download">...</a>. 當你使用 Node.attr(String key) 方法來取得a元素的href屬性時,它將直接返回在HTML源碼中指定的值。api

假如你須要取得一個絕對路徑,須要在屬性名前加 abs: 前綴。這樣就能夠返回包含根路徑的URL地址attr("abs:href"),所以,在解析HTML文檔時,定義baseURI很是重要。app

若是你不想使用abs: 前綴,還有一個方法可以實現一樣的功能 Node.absUrl(String key)spa

相關文章
相關標籤/搜索