Jsoupの研究ノート

Jsoupの研究ノート

Jsoupは、実際のHTMLを処理するためのJavaライブラリです。これは、抽出したデータを操作するため、非常に便利なAPIを提供します。
GitHubの住所:https://github.com/jhy/jsoup/
JARパッケージをダウンロード:https://jsoup.org/download

解決

Jsoupは、HTMLを解析する方法はいくつかあります。

  1. HTML文字列。
  2. URL;
  3. ローカルファイル;

HTMLの文字列解析

あなたには、いくつかのhtml形式の文字列を持っているし、あなたがJsoup.parse(文字列のHTML)を使用することができます内部の内容を解析したい場合は、静的メソッドは、Documentオブジェクトを返します。このオブジェクトが解決することができます使用してください。

String html = "<html><head><title>First parse</title></head>"
  + "<body><p>Parsed HTML into a doc.</p></body></html>";
Document doc = Jsoup.parse(html);

URL解析

あなたがネットワークのウェブ側から解析を取得する必要がある場合、あなたはJsoup.connect(文字列のURL)を使用することができ、静的メソッドは、Connectionオブジェクトを返し、HTMLファイルを抽出し、解析するためのget()またはポスト()メソッドを使用します。このオブジェクトが解決することができます使用してください。(このメソッドは、WebのURLはhttpとhttpsプロトコルをサポートされています)

Document doc = Jsoup.connect("http://example.com")
  .data("query", "Java")	// 请求参数
  .userAgent("Mozilla")		// 设置 User-Agent 
  .cookie("auth", "token")	// 设置 cookie
  .timeout(3000)			// 设置连接超时时间
  .post();		            // 使用 POST 方法访问 URL

ローカルファイルの解析

静的Jsoup.parse(内のファイル、文字列たcharsetName、文字列BASEURI)メソッドを使用して、ローカルHTMLファイルがあります。BASEURIとしてファイルを使用して位置オーバーロードされたメソッドの解析(文字列たcharsetName、中​​のファイル)があります。

File input = new File("/tmp/input.html");
// baseUri 解析器使用该参数在 <base href> 找到元素之前解析文档中的相对 URL 。如果您不关心这一点,则可以传递空字符串。
Document doc = Jsoup.parse(input, "UTF-8", "http://example.com/");

解析データ

DOM解析

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

// 获得 id 为 content 的元素
Element content = doc.getElementById("content");
// 获得标签为 a 的所有元素
Elements links = content.getElementsByTag("a");
for (Element link : links) {
  // 获得 href 属性的值
  String linkHref = link.attr("href");
  // 返回文本
  String linkText = link.text();
}

以下は、いくつかの共通APIメソッドです。

メソッド名 説明
getElementByIdを(文字列ID) IDによって要素を探します
getElementsByTag(文字列タグ) 指定されたラベル名の検索要素を使用します
getElementsByClass(文字列クラス名) このクラスの要素を探します
getElementsByAttribute(文字列のキー) この属性が設定された要素を探します

使用解析を選択

あなたは、検索または操作要素にCSSまたは類似jqueryのセレクタの構文を使用したい場合。Element.select(文字列セレクタ)とElements.select(文字列セレクタ)メソッドを使用します。

File input = new File("D:\test.html"); 
Document doc = Jsoup.parse(input,"UTF-8"); 
// 具有 href 属性的链接
Elements links = doc.select("a[href]"); 
// 所有 src 包含.png 的图片
Elements pngs = doc.select("img[src$=.png]");
// 找出所有 class=masthead 的元素
Element masthead = doc.select("div.masthead").first(); 
// 所有符合 <h3 class=r><a href="">...</a></h3> 的元素
Elements resultLinks = doc.select("h3.r > a"); 

概要を選択します

パラメータ 説明
NS | NG 見つけるために、名前:なFBとして、ラベルの位置決め名前空間を使用してFBを:名前要素
#ID IDは、位置決め要素を使用して、例えば#logo
。クラス Class属性の位置決め要素、例えば.head
タグ名 などのdivとして、検索する名前タグを使用します
[属性] 検索するために使用される要素の属性は、例えば、[HREFは】表すhref属性を持つすべての要素を取り出します
[^ ATTR] 要素を配置するために使用される名前の接頭辞を属性、例えば、[^データ - ]は、データセットを検索するために使用されているHTML5属性
[ATTR =値] ポジショニング使用して属性値、例えば、[幅= 500]すべてのwidth属性の値要素500に配置されます
[ATTR ^ =値] そもそもプロパティ値
[ATTR $ =値] 最後に属性値
[ATTR * =値] プロパティ値が含まれています
[ATTR〜=正規表現] 正規表現フィルタの属性値を使用して、例えばIMG [SRC〜=(I?)。(PNG |?JPEのグラム)]
* すべての要素を配置します

組み合わせの使用を選択します

パラメータ 説明
エル#IDは 例えば、要素の位置ID値に対応#ロゴ
el.class div.headに対応する実施例の値が、指定された位置決め要素クラス
XXXX
エル[ATTR] 全て位置決め要素は、[HREF]として、プロパティを定義
三つ以上の任意の組み合わせ 例如[HREF] #logo、[名前] .outerlink
次の5つのセレクタ構文は、親子関係、組み合わせリレーショナルおよび階層関係を含む要素間の関係の組み合わせです。
祖先の子 例えば先祖の子供、:DIV#page_wrapperのdiv [クラス〜= MainContentの*]
親>子 たとえば、次のようにdiv.infoSet>スパン
siblingA + siblingB 最初の兄弟要素Bの前に要素を探します
siblingA〜siblingX 要素Xの前に兄弟要素を探します
エル、エル、エル 複数の組み合わせを選択し、唯一の要素は、任意のマッチをセレクタを見つけるために

フィルタの使用方法

パラメータ 説明
:LT(n)は 例えば、TDのために:LT(3)未満の3つの手段
:GT(N) DIV P:GT(2)DIVで表される二つ以上のPを含有します
:当量(N) フォーム入力:当量(1)を表す入力フォームが一つだけが含ま
HAS(セレクタ) DIV:has§表現は要素のdiv Pが含まれています
:いない(セレクタ) DIV:ありません(.logoは)彼らはクラスが含まれていないと述べた=すべてのdivロゴ要素のリスト
:(テキスト)が含まれ テキスト要素、大文字と小文字を区別しない、例えばpが含まれています:(oschina)が含まれ
:containsOwn(テキスト) テキスト情報は、指定されたフィルタ基準に完全に等しいです。
:マッチ(正規表現) テキストフィルタリングのための正規表現を使用する:DIV:マッチ(?(I)ログイン)
:matchesOwn(正規表現) 自分のテキストを検索するために正規表現を使用します

データを変更します

追加/削除する要素の属性:jsoupは、次のようなページ要素を、変更することができます。Jsoupは属性とテキスト要素を変更することができますを含む、(あなたがそれを削除してから新しい要素を挿入することができます)要素を識別するために、セレクタを使用する必要があると外部のラベル名を変更していないに加えて、上記の方法によって変更することができます。

あなたがHTML文書を変更取得することができますHTML()メソッドの直接呼び出し要素(複数可)を修正する仕上がり。

// 为所有链接增加 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(""); 

HTMLドキュメントのクリーンアップ

ページのスクリプトに挿入された悪意のあるユーザーを防ぐために、テキストベースのフィルタ(タブ部分のみ許可属性)を使用してjsoupホワイトリスト。

String unsafe = "<p><a href='http://www.oschina.net/' onclick='stealCookies()'> 
 开源中国社区 </a></p>"; 
String safe = Jsoup.clean(unsafe, Whitelist.basic()); 
 // 输出 : 
 // <p><a href="http://www.oschina.net/" rel="nofollow"> 开源中国社区 </a></p>

ホワイトリスト方法

メソッド名 簡単な紹介
無し() テキスト情報のみを許可します
基本的な() 允许的标签包括:a, b, blockquote, br, cite, code, dd, dl, dt, em, i, li, ol, p, pre, q, small, strike, strong, sub, sup, u, ul, 以及合适的属性
simpleText() 只允许 b, em, i, strong, u 这些标签
basicWithImages() 在 basic() 的基础上增加了图片
relaxed() 这个过滤器允许的标签最多,包括:a, b, blockquote, br, caption, cite, code, col, colgroup, dd, dl, dt, em, h1, h2, h3, h4, h5, h6, i, img, li, ol, p, pre, q, small, strike, strong, sub, sup, table, tbody, td, tfoot, th, thead, tr, u, ul
whitelist.addTags(String… tags) 非静态方法:添加允许的标签。可以使用removeTags删除
whitelist.addAttributes(String tag, String… attributes) 非静态方法:添加允许的属性,可以用removeAttributes删除

おすすめ

転載: blog.csdn.net/qq_16830879/article/details/89495306