在處理網頁形式的文本時, 剛開始使用了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,首先會清除存在的。