jsoup は、URL アドレスと HTML テキスト コンテンツを直接解析できる Java HTML パーサーです。これは、DOM、CSS、および jQuery のような操作メソッドを通じてデータを取得および操作するための、非常に低労力の API を提供します。
Jsoup.jpg
公式 Web サイトのアドレス: http://jsoup.org/
から jsou-1.8.3.jar ファイルをダウンロードします。公式 Web サイトにアクセスし、独自のプロジェクトの lib ライブラリに追加すると、Jsoup が提供する API を使用できます。公式 Web サイトには、開発者が学習できる一連の使用ガイド (Cookbook) も提供されています。
Jsoup は HTML を解析して Document オブジェクトを取得し、Document のプロパティを操作することで HTML ページのコンテンツを取得します。そのため、開始する前に、まず、ノード、要素、などの関連する概念の違いを紹介します。概念の混乱が誤用につながるのを防ぐため、XML で文書化します。
public abstract class Node implements Cloneable
public class Element extends Node
public class Document extends Element
の 3 つの定義からわかります。 Jsoup ソースコード 以下のようなツリー継承関係が生成されます。
Node, Element, Document 継承関係.png
Node (ノード) が導出されます上記の継承関係から明らかなように、ドキュメント内のすべてのコンテンツはノードと見なすことができます。ノードには、属性ノード(Attribute)、ノートノード(Note)、テキストノード(Text)、要素ノード(Element)など、さまざまな種類があります。一般に、ノードはこれらのさまざまなノードの総称です。
Element (要素) 要素はノードに比べて狭い範囲で定義されます。要素はノードから継承し、ノードのサブセットであるため、要素もノードであり、ノードが所有するパブリック プロパティとメソッドも要素内で使用できます。
Document (ドキュメント) 要素から継承され、HTML ドキュメント全体のソース コードの内容を参照します。System.out.println( を通じてコンソールに出力できます。 document.toString()); Web ページのソース コードのコンテンツ。
相互変換は、ノード、要素、ドキュメント間の「絡み合った」関係に基づいており、各クラスで提供されるメソッドを使用して、使用する必要なオブジェクトを適切に変換して取得できます。
Jsoup が HTML を解析して Document オブジェクトを取得する方法は、オンライン URL、HTML テキスト文字列、ファイルの 3 つのカテゴリに分類されます。対応する API は次のとおりです。
connect(String url)
parse(String html)
parse(File in, String charsetName)
Document オブジェクトを取得した後、それを HTML ソース コードと結合し、Jsoup が提供する API を使用して、クラス、タグ、ID を通じて対応する要素を取得できます。 、属性、およびその他の関連属性を使用して、必要な Web ページのコンテンツを取得します。
以下では、Jsoup の公式 Web サイトのクックブック ページを例として、ページ ディレクトリのコンテンツを解析して取得します。
Web ページのコンテンツ:
Jsoup Cookbook Web page.jpg
Web ページのソース コード:
<!DOCTYPE html><!-- saved from url=(0031)http://www.open-open.com/jsoup/ --><html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>jsoup开发指南,jsoup中文使用手册,jsoup中文文档</title><meta name="keywords" content="jsoup开发指南,jsoup中文使用手册,jsoup中文文档,jsoup java html解析器"><meta name="description" content="jsoup Cookbook中文版 - 由http://www.open-open.com翻译整理"><link rel="stylesheet" type="text/css" href="./jsoup开发指南,jsoup中文使用手册,jsoup中文文档_files/style.css"></head><body class="n1-cookbook"><div class="wrap"><div class="header"><div class="nav-sections"><ul> <li class="n1-home"> <h4><a href="http://jsoup.org/">jsoup</a></h4></li> <li class="n1-news"><a href="http://jsoup.org/news/">新闻</a></li> <li class="n1-bugs"><a href="http://jsoup.org/bugs">bugs</a></li> <li class="n1-discussion"><a href="http://jsoup.org/discussion">讨论</a></li> <li class="n1-download"><a href="http://jsoup.org/download">下载</a></li> <li class="n1-api"><a href="http://jsoup.org/apidocs/">api参考</a></li> <li class="n1-cookbook"><a href="http://jsoup.org/cookbook/">Cookbook</a></li></ul></div></div><div class="breadcrumb"><a href="http://jsoup.org/">jsoup</a> <span class="seperator">»</span> cookbook </div><div class="content"><div class="col1"><h1>jsoup Cookbook(中文版)</h1><div class="toc"><h3>入门</h3><ol start="1"> <li><a href="http://www.open-open.com/jsoup/parsing-a-document.htm">解析和遍历一个html文档</a></li></ol><h3>输入</h3><ol start="2"> <li><a href="http://www.open-open.com/jsoup/parse-document-from-string.htm">解析一个html字符串</a></li> <li><a href="http://www.open-open.com/jsoup/parse-body-fragment.htm">解析一个body片断</a></li> <li><a href="http://www.open-open.com/jsoup/load-document-from-url.htm">根据一个url加载Document对象</a></li> <li><a href="http://www.open-open.com/jsoup/load-document-from-file.htm">根据一个文件加载Document对象</a></li></ol><h3>数据抽取</h3><ol start="6"> <li><a href="http://www.open-open.com/jsoup/dom-navigation.htm">使用dom方法来遍历一个Document对象</a></li> <li><a href="http://www.open-open.com/jsoup/selector-syntax.htm">使用选择器语法来查找元素</a></li> <li><a href="http://www.open-open.com/jsoup/attributes-text-html.htm">从元素集合抽取属性、文本和html内容</a></li> <li><a href="http://www.open-open.com/jsoup/working-with-urls.htm">URL处理</a></li> <li><a href="http://www.open-open.com/jsoup/example-list-links.htm">程序示例:获取所有链接</a></li></ol><h3>数据修改</h3><ol start="11"> <li><a href="http://www.open-open.com/jsoup/set-attributes.htm">设置属性值</a></li> <li><a href="http://www.open-open.com/jsoup/set-html.htm">设置元素的html内容</a></li> <li><a href="http://www.open-open.com/jsoup/set-text.htm">设置元素的文本内容</a></li></ol><h3> html清理</h3><ol start="14"> <li><a href="http://www.open-open.com/jsoup/whitelist-sanitizer.htm">消除不受信任的html (来防止xss攻击)</a></li></ol><script src="./jsoup开发指南,jsoup中文使用手册,jsoup中文文档_files/ca-pub-7963911354665843.js"></script><script type="text/javascript"><!--google_ad_client = "pub-7963911354665843";/* 728x90, 创建于 11-1-27 */google_ad_slot = "5890482646";google_ad_width = 728;google_ad_height = 90;//--></script><script type="text/javascript" src="./jsoup开发指南,jsoup中文使用手册,jsoup中文文档_files/show_ads.js"></script><ins id="aswift_0_expand" style="display:inline-table;border:none;height:90px;margin:0;padding:0;position:relative;visibility:visible;width:728px;background-color:transparent"><ins id="aswift_0_anchor" style="display:block;border:none;height:90px;margin:0;padding:0;position:relative;visibility:visible;width:728px;background-color:transparent"><iframe width="728" height="90" frameborder="0" marginwidth="0" marginheight="0" vspace="0" hspace="0" allowtransparency="true" scrolling="no" allowfullscreen="true" onload="var i=this.id,s=window.google_iframe_oncopy,H=s&&s.handlers,h=H&&H[i],w=this.contentWindow,d;try{d=w.document}catch(e){}if(h&&d&&(!d.body||!d.body.firstChild)){if(h.call){setTimeout(h,0)}else if(h.match){try{h=s.upd(h,i)}catch(e){}w.location.replace(h)}}" id="aswift_0" name="aswift_0" style="left:0;position:absolute;top:0;"></iframe></ins></ins></div></div><div class="col2"></div></div><div class="footer"><b>jsoup</b> html parser: copyright © 2009 - 2011 <a href="http://www.open-open.com/" rel="me"><b>jonathan hedley</b></a> </div></div></body></html>
Jsoup の解析:
import java.io.IOException;import java.text.ParseException;import org.jsoup.Jsoup;import org.jsoup.nodes.Document;import org.jsoup.select.Elements;/** * @author 亦枫 * @created_time 2016年1月5日 * @file_user_todo Java测试类 * @blog http://www.jianshu.com/users/1c40186e3248/latest_articles */public class JavaTest { /** * 入口函数 * @param args * @throws ParseException */ public static void main(String[] args) throws ParseException { try { //解析Url获取Document对象 Document document = Jsoup.connect("http://www.open-open.com/jsoup/").get(); //获取网页源码文本内容 System.out.println(document.toString()); //获取指定class的内容指定tag的元素 Elements liElements = document.getElementsByClass("content").get(0).getElementsByTag("li"); for (int i = 0; i < liElements.size(); i++) { System.out.println(i + ". " + liElements.get(i).text()); } } catch (IOException e) { System.out.println("解析出错!"); e.printStackTrace(); } }}
解析結果:
Jsoup parse result.png
著者のヘッドライン アカウントへの購読を歓迎します: Technology Bird Yifeng WeChat 公開アカウント [Technical Bird]、態度のある技術公開アカウントをフォローすることを歓迎します。
テクノロジー Bird_WeChat QR code.gif