在處理網頁形式的文本時, 剛開始使用了scala.xml來解析
import scala.xml._
XML.loadString(x.toString).text()
這樣對完整格式的xml文本處理的很好,但是有些xml形式并不完整,而且HTML格式的文本不能解析
查閱了一下解決方案,stackoverflow有給出的方法是先将html格式轉為xml格式再進行處理,挺麻煩的,看了下java的Jsoup工具包,類似python-BeautifulSoup, 使用很友善,完美解決上面的兩個問題,并且速度也很快, 由于對java還比較陌生,記錄一下Jsoup的使用方法:
下載下傳位址: http://jsoup.org
使用技巧: https://www.ibm.com/developerworks/cn/java/j-lo-jsouphtml/
擷取純文字:
import org.jsoup.Jsoup
Jsoup.parse(x(3).toString).text()
API:
一、簡介
該類是Node的直接子類,同樣實作了可克隆接口。類聲明:public class Element extends Node
它表示由一個标簽名,多個屬性和子節點組成的html元素。從這個元素中,你可以提取資料,可以周遊節點樹,可以操縱html。
二、構造方法
1、public Element(Tag tag, String baseUri, Attributes attributes) 建立一個新的、獨立的元素。獨立即沒有父節點。attributes指初始屬性。
2、public Element(Tag tag, String baseUri) 使用标簽和base URL建立一個新的元素。
三、方法詳細
1、public String nodeName() 得到節點名
2、public String tagName() 得到元素的标簽名 如p
3、public Element tagName(String tagName) 改變元素的标簽 。如:el.tagName("p") 把一個标簽改變為一個
标簽。
4、public Tag tag() 得到元素的Tag
5、public boolean isBlock()測試元素是否是塊級元素。
6、public String id() 得到元素的id屬性
7、public Element attr(String attributeKey, String attributeValue) 設定元素的屬性值。如果該鍵已存在,則替換掉以前的值;否則就新增。
8、public Map dataset() 得到元素的HTML5自定義資料屬性。元素中每個以"data-"開頭的鍵的屬性都包含在資料集範圍内。
如這個元素
Java" class="group">... 就有如下資料集:package=jsoup, language=java.
傳回的map是對元素屬性的篩選後的map集合。對一個map的改變(增、删、改)會影響其他map
9、public final Element parent() 得到節點的父節點
10、public Elements parents() 得到元素的父類和祖先節點直到文檔的根。傳回元素最接近的一個父類的堆棧。
11、public Element child(int index) 通過索引得到元素的子元素。
注意:一個元素的子元素可以是元素和節點的混合。這個方法隻檢查過濾後的子元素的集合(保留那些children是elements的children,過濾掉children是Nodes的children),index也是基于過濾後的集合的索引。
12、public Elements children() 得到子元素集
13、public List textNodes() 得到元素的子文本節點集合。該集合不可修改但是文位元組點可以被操縱。這是一個比較有效率的過濾文位元組點的方法。
例如這段html:
One Two Three
Four
用p元素來選擇。
p.text() = "One Two Three Four" p.ownText() = "One Three Four" p.children() = Elements[,
] p.childNodes() = List["One ", , " Three ",
, " Four"] p.textNodes() = List["One ", " Three ", " Four"]
14、public List dataNodes() 得到元素的子資料節點。該集合不可修改但是資料節點可以被操縱。這是一個比較有效率的過濾資料節點的方法。
15、public Elements select(String cssQuery) 查詢比對CSS query選擇器的元素集。被比對的元素可能是它本身,也可能是它的任意子元素。 這種方法通常比使用DOM類型getelementby 的方法更強大,因為多個過濾器可以結合。如:
el.select("a[href]") - finds links (a tags with href attributes) el.select("a[href=example.com]") - finds links pointing to example.com (loosely)
16、public Element appendChild(Node child) 給元素增加一個子節點。要求該子節點沒有已經存在父類。
17、public Element prependChild(Node child) 在該元素的子元素們的最前面增加一個子節點。要求該子節點沒有已經存在父類。
18、public Element appendElement(String tagName) 使用tagName建立一個新的元素,然後把它作為該元素的最後一個子元素。如:parent.appendElement("h1").attr("id", "header").text("Welcome");
19、public Element prependElement(String tagName) 建立一個新的元素,然後把它作為該元素的第一個子元素。
20、public Element appendText(String text) 建立一個新的文位元組點,然後追加到該元素中。
21、public Element prependText(String text) 建立一個新的文位元組點,置于該元素子元素的最前面。
22、public Element append(String html) 增加一段html到該元素中,該html會被解析,然後每個節點都會置于元素末尾。
23、public Element prepend(String html) 增加一段html到該元素中,該html會被解析,然後每個節點都會置于元素開頭。
24、public Element before(String html) 在該元素前面插入一段指定的html到DOM樹中。比如用來作為前面的兄弟節點。
25、public Element before(Node node) 在該節點前面插入一個指定的節點到DOM樹中。比如用來作為前面的兄弟節點。
26、public Element after(String html) 在該元素後面插入一段指定的html到DOM樹中。比如用來作為後面的兄弟節點。
27、public Element after(Node node) 在該節點後面插入一個指定的節點到DOM樹中。比如用來作為後面的兄弟節點。
28、public Element empty() 移除該元素的所有子節點。
29、public Element wrap(String html) 用提供的html包裝該元素。
30、public Elements siblingElements() 得到元素的兄弟元素。該元素本身不包含在内。
31、public Element nextElementSibling() 得到該元素的下一個兄弟元素。
32、public Element previousElementSibling() 得到該元素的上一個兄弟元素。
33、public Element firstElementSibling() 得到該元素的第一個兄弟元素。
34、public Integer elementSiblingIndex() 得到該元素在兄弟元素集合中的索引。如果該元素是第一個,則傳回0.
35、public Element lastElementSibling() 得到該元素的最後一個兄弟元素。
36、public Elements getElementsByTag(String tagName) 根據tagName查詢子元素集
37、public Element getElementById(String id) 通過ID查找元素。包括元素本身和其子元素都在查詢範圍内。
注意:該方法尋找的是從該元素開始的第一個比對的ID對應的元素,如果從不同位置作為起點去尋找可能得到不同的比對該ID的元素
38、public Elements getElementsByClass(String className) 尋找包含className的class的元素集。包括元素本身和其子元素都在查詢範圍内。不區分大小寫。元素集可能包含多個class(
) 這個方法會檢測每一個class,是以你可以使用el.getElementsByClass("header")找到上面這個元素。
39、public Elements getElementsByAttribute(String key) 通過元素屬性的鍵尋找元素集。
40、public Elements getElementsByAttributeStarting(String keyPrefix) 根據屬性的字首尋找元素。HTML5屬性集使用data-字首
41、public Elements getElementsByAttributeValue(String key, String value) 尋找屬性為指定值的元素。不區分大小寫。
42、public Elements getElementsByAttributeValueNot(String key, String value) 尋找不包含指定屬性的或者包含但有不同值的元素集。不區分大小寫。
43、public Elements getElementsByAttributeValueStarting(String key, String valuePrefix) 尋找鍵為key,值以valuePrefix開頭的元素集。
44、public Elements getElementsByAttributeValueEnding(String key, String valueSuffix) 尋找鍵為key,值以valueSuffix作為字尾的元素集。
45、public Elements getElementsByAttributeValueContaining(String key, String match) 尋找鍵為key,值包含match的元素集。
46、public Elements getElementsByAttributeValueMatching(String key, Pattern pattern) 尋找鍵為key,值比對給定的正規表達式的元素集。
47、public Elements getElementsByAttributeValueMatching(String key, String regex) 尋找鍵為key,值比對給定的正規表達式的元素集。
48、public Elements getElementsByIndexLessThan(int index) 尋找那些索引小于index的兄弟元素集。
49、public Elements getElementsByIndexGreaterThan(int index) 尋找那些索引大于index的兄弟元素集。
50、public Elements getElementsByIndexEquals(int index) 尋找那些索引等于index的兄弟元素集。
51、public Elements getElementsContainingText(String searchText) 尋找包含searchText字元串的元素集。不區分大小寫。該文本可能直接出現在該元素中,也可能出現在其子孫元素中。
52、public Elements getElementsContainingOwnText(String searchText) 尋找包含searchText字元串的元素集。不區分大小寫。該文本是出現在該元素中。而不是其子孫元素中。
53、public Elements getElementsMatchingText(Pattern pattern) 尋找文本比對給定正規表達式的元素集。
54、public Elements getElementsMatchingText(String regex) 尋找文本比對給定正規表達式的元素集。
55、public Elements getElementsMatchingOwnText(Pattern pattern) 尋找自身文本比對給定正規表達式的元素集。
56、public Elements getElementsMatchingOwnText(String regex) 尋找自身文本比對給定正規表達式的元素集。
57、public Elements getAllElements() 尋找所有元素集,包含自身和其子孫。
58、public String text() 得到該元素文本和和其子孫文本的結合。如:
Hello there now!
p.text()會傳回"Hello there now!"
59、public String ownText() 得到該元素自身的文本。如:
Hello there now!
p.ownText()會傳回"Hello now!"
60、public Element text(String text) 設定元素的文本内容。之前任何存在的文本都會被清除掉。
61、public boolean hasText() 測試該元素是否還有非空格的文本内容。
62、public String data() 得到元素的資料結合。資料可以是腳本裡面的。
63、public String className() 得到元素class屬性的文本内容 可能包含多個class names,用空格分開。如;
傳回"header gray"。
64、public Set classNames() 得到元素的所有class names,如;
,傳回"header", "gray"的set集合
65、public Element classNames(Set classNames) 用提供的class names設定元素的class屬性。
66、public boolean hasClass(String className) 測試元素是否含有一個指定的class,不區分大小寫。
67、public Element addClass(String className) 給元素的class屬性增加一個className值。
68、public Element removeClass(String className) 從元素的class屬性中移除指定值。
69、public Element toggleClass(String className) 反轉class屬性的className值,有則移除,沒有則新增。
70、public String val() 得到表單元素的值
71、public Element val(String value) 設定表單元素的值
72、public String html() 檢索元素的内部html
73、public Element html(String html) 設定元素内部html,首先會清除存在的。