<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
使用python寫爬蟲的人,應該都聽過beautifulsoup4
這個包,用來它來解析網頁甚是方便。那麼在java裡有沒有類似的包呢?當然有啦!而且也非常好用。下面隆重介紹jsoup
!
jsoup
實現了 WHATWG HTML5 規範,能夠與現代瀏覽器解析成相同的DOM。其解析器能夠盡最大可能從你提供的HTML檔案來建立一個乾淨的解析結果,無論HTML的格式是否完整。比如它可以處理沒有關閉的標籤。
舉個栗子:
<p>Lorem <p>Ipsum parses to <p>Lorem</p> <p>Ipsum</p>
它也可以處理隱式標籤,建立可靠的檔案結構(html標籤包含head 和 body,在head只出現恰當的元素)。
官網地址在這裡
jar 包的下載地址
jsoup 可以從包括字串、URL 地址以及本地檔案來載入 HTML 檔案,並生成 Document 物件範例。
// (1)從字串中獲取 String html = "<html><head><title>First parse</title></head>" + "<body><p>Parsed HTML into a doc.</p></body></html>"; Document doc1 = Jsoup.parse(html); // (2)從 URL 直接載入 HTML 檔案 // get方法 Document doc2 = Jsoup.connect("http://www.163.com").get(); // post方法 Document doc = Jsoup.connect("http://example.com") .data("query", "Java") .userAgent("Mozilla") .cookie("auth", "token") .timeout(3000) .post(); // (3)從檔案中載入 HTML 檔案 File input = new File("D:/test.html"); Document doc = Jsoup.parse(input,"UTF-8","http://www.163.com/");
常用到的方法如下:
public static Connection connect(String url) public static Document parse(String html, String baseUri) public static Document parse(URL url, int timeoutMillis) throws IOException public static Document parse(File in, String charsetName) throws IOException public static Document parse(InputStream in, String charsetName, String baseUrl) throws IOException
parse
方法能夠將輸入的 HTML 解析為一個新的檔案 (Document),只要解析的不是空字串,就能返回一個結構合理的檔案,其中包含(至少) 一個head和一個body元素。
上面的引數 baseUri
的作用是,如果要解析的html中存在相對路徑,那麼就根據這個引數變成絕對路徑, 如果不需要可以傳入一個空字串。
注:通過connect方法來獲得 html 原始碼,有的時候會遇到亂碼的問題,這個時候該怎麼辦麼?方法裡有一個 parse
方法,傳入引數 InputStream
、charsetName
以及baseUrl
,所有可以這樣解決:
String url = "http://xxxxxxx"; Document document = Jsoup.parse(new URL(url).openStream(), "GBK", url);// 以 gbk 編碼為慄。
Jsoup的強項是解析html,當然了,它能處理一些簡單情況,遇到複雜的情形還是使用 httpClient 這個包吧,你值得擁有!
舉個栗子
Element content = doc.getElementById("content"); Elements links = content.getElementsByTag("a"); Elements mx = content.getElementsByClass("help");
注:doc 為 Document 物件。
還有寫常用的方法,比如
public Elements getElementsByAttributeValue(String key, String value) public Element attr(String attributeKey, String attributeValue) public Elements getAllElements() // 獲得孩子節點中所有的文字拼接 public String text() // 獲得節點的內部html public String html()
Document 物件還有一個方法
// 獲取標題 public String title() // 獲得某節點的html,這個方法繼承自Node類,所以Element類也有該方法 public String outerHtml()
在元素檢索方面,jsoup 的選擇器簡直無所不能。
jsoup 選擇器很多,這裡僅僅舉出幾個栗子,
Elements links = doc.select("a[href]"); // 具有href屬性的a標籤 Elements pngs = doc.select("img[src$=.png]");// src屬性以.png結尾的img標籤 Element masthead = doc.select("div.masthead").first();// class屬性為masthead的div標籤中的第一個 Elements resultLinks = doc.select("h3.r > a"); // class屬性為r的h3標籤的直接子a標籤 Elements resultLinks = doc.select(img[src~=(?i).(png|jpe?g)])
Selector選擇器概述
tagname: 通過標籤查詢元素,比如:a
ns|tag: 通過標籤在名稱空間查詢元素,比如:可以用 fb|name 語法來查詢 <fb:name> 元素
#id: 通過ID查詢元素,比如:#logo
.class: 通過class名稱查詢元素,比如:.masthead
[attribute]: 利用屬性查詢元素,比如:[href]
[^attr]: 利用屬性名字首來查詢元素,比如:可以用[^data-] 來查詢帶有HTML5 Dataset屬性的元素
[attr=value]: 利用屬性值來查詢元素,比如:[width=500]
[attr^=value], [attr$=value], [attr*=value]: 利用匹配屬性值開頭、結尾或包含屬性值來查詢元素,比如:[href*=/path/]
[attr~=regex]: 利用屬性值匹配正規表示式來查詢元素,比如: img[src~=(?i).(png|jpe?g)]
*: 這個符號將匹配所有元素
Selector選擇器組合使用
el#id: 元素+ID,比如: div#logo
el.class: 元素+class,比如: div.masthead
el[attr]: 元素+class,比如: a[href]
任意組合,比如:a[href].highlight
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
偽選擇器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): 查詢自身包含文字匹配指定正規表示式的元素
注: 上述偽選擇器索引是從0開始的,也就是說第一個元素索引值為0,第二個元素index為1等。
對於 Elements 的來歷,看這裡
public class Elements extends ArrayList<Element>
另外,可以檢視Selector API參考來了解更詳細的內容,可以看出,jsoup 使用跟 jQuery 一模一樣的選擇器對元素進行檢索,以上的檢索方法如果換成是其他的 HTML 直譯器,至少都需要很多行程式碼,而 jsoup 只需要一行程式碼即可完成。
// 為所有連結增加 rel=nofollow 屬性 doc.select("div.comments a").attr("rel", "nofollow"); // 為所有連結增加 class=mylinkclass 屬性 doc.select("div.comments a").addClass("mylinkclass"); // 刪除所有圖片的 onclick 屬性 doc.select("img").removeAttr("onclick"); // 清空所有文字輸入框中的文字 doc.select("input[type=text]").val(""); // 獲得rel屬性的值 doc.select("div.comments a").attr("rel");
參考
以上就是java爬蟲工具jsoup解析HTML的工具學習的詳細內容,更多關於java爬蟲工具jsoup的資料請關注it145.com其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45