ホームページ > 記事 > ウェブフロントエンド > jsoup は HTML を解析します information_html/css_WEB-ITnose
jsoup は、URL アドレスと HTML テキスト コンテンツを直接解析できる Java HTML パーサーです。非常に省力的な API を提供しており、
DOM、CSS、および jQuery のような操作メソッドを通じてデータを取得および操作できます。
1. URL、ファイル、または文字列から HTML を解析します
jsoup のメインクラス階層を図に示します。
ドキュメント入力
// 直接从字符串中输入 HTML 文档String html = "<html><head><title>learn jsoup</title></head>" + "<body id='body'><p>Parse and traverse an HTML document.</p></body></html>";Document doc = Jsoup.parse(html);// 从URL直接加载 HTML 文档Document doc = Jsoup.connect("http://itmyhome.com/").get();String title = doc.title();// 从文件中加载HTML文档File input = new File("D:/index.html");Document doc = Jsoup.parse(input, "UTF-8","http://itmyhome.com");
HTML ドキュメントには多くのリンク、画像、参照された外部スクリプト、CSS ファイルなどが含まれるため、parse メソッドの 3 番目のメソッドでは 3 番目のパラメータを指定する必要はありません
そして 3 番目のメソッドは、baseURL と呼ばれますこのパラメータの意味は、HTML ドキュメントが相対パスを使用して外部ファイルを参照する場合、
jsoup がこれらの URL に接頭辞 (baseURL) を自動的に追加することです。
たとえば、8a3d155f684f52248478510e38b4b59aitmyhome5db79b134e9f6b82c0b36e0489ee08ed は ec1e5d79967b0e6356e473b4efac5fb3itmyhome5db79b134e9f6b82c0b36e0489ee08ed に変換されます。
データ抽出
String html = "<html><head><title>learn jsoup</title></head>" + "<body id='content'><a href='itmyhome.com'>hello</a>" + "<a href='blog.itmyhome.com'>jsoup</a></body></html>";Document doc = Jsoup.parse(html);Element content = doc.getElementById("content");Elements links = content.getElementsByTag("a");for (Element link : links) { String linkHref = link.attr("href"); String linkText = link.text(); System.out.println(linkHref + ", " + linkText);}
itmyhome.com, helloblog.itmyhome.com, jsoupDescription
Elements このオブジェクトは、要素を検索し、要素内のデータを抽出して処理するための一連の DOM のようなメソッドを提供します。詳細は次のとおりです:
要素を検索getElementById(String id)
attr(String key) 属性の取得 attr(String key, String value) 属性の設定
append(String html)、prepend(String html)
セレクター構文を使用して要素を検索する
Document doc = Jsoup.connect("http://itmyhome.com/").get();Elements links = doc.select("a[href]"); // 带有href属性的a元素Elements pngs = doc.select("img[src$=.png]");// 扩展名为.png的图片Element icons = doc.select("span.icon").first();// class等于icon的span标签Elements resultLinks = doc.select("#header p"); // id为header元素之后的p元素
次の表は、jsoup のすべての構文の詳細なリストです。 jsoup セレクター。
表 1. 基本的な使用法:
#id | |||||||||||||||||||||||||||||||||||
.class | |||||||||||||||||||||||||||||||||||
[attribute]え] | |||||||||||||||||||||||||||||||||||
[^attr] | |||||||||||||||||||||||||||||||||||
[attr=value] | |||||||||||||||||||||||||||||||||||
[attr^ =value]、[attr$=value]、[attr *=value] | |||||||||||||||||||||||||||||||||||
[attr~=regex] | |||||||||||||||||||||||||||||||||||
* | |||||||||||||||||||||||||||||||||||
ancestor child | これら 5 つは、親子関係、マージ関係、階層関係を含む要素間の結合関係を表すセレクター構文です。|
親 > 子 | |
兄弟 A + 兄弟 B | |
エル、エル、エル | |
表 3: 式: | |
:lt(n) | |
div p:gt(2) は div に 2 つ以上の p が含まれていることを意味します | |
:eq(n) |
:has (seletor)
div:has(p) は p 要素を含む div を表します:not(selector) | div:not(.logo) は、 class=logo 要素 | |||||||||
:contains(text) | p:contains(oschina) など、大文字と小文字を区別しない、特定のテキストを含む要素 | |||||||||
:containsOwn(text) | テキスト情報が含まれる場所のフィルタリング指定された条件と完全に等しい | |||||||||
:matches(regex) | テキスト フィルタリングに正規表現を使用します: div:matches((?i)login) | |||||||||
:matchesOwn(regex) | 正規表現を使用して検索しますそれ自体のテキスト | |||||||||
从元素抽取属性,文本和HTML要取得一个属性的值,可以使用Node.attr(String key) 方法 对于一个元素中的文本,可以使用Element.text()方法 对于要取得元素或属性中的HTML内容,可以使用Element.html(),或Node.outerHtml()方法 示例: String html = "<p>my <a href='http://itmyhome.com/'><b>blog</b></a> link.</p>";Document doc = Jsoup.parse(html);// 解析HTML字符串返回一个Document实现Element link = doc.select("a").first();// 查找第一个a元素String text = doc.body().text(); // "my blog link" 取得字符串中的文本String linkHref = link.attr("href"); // "http://itmyhome.com/" 取得链接地址String linkText = link.text(); // "blog" 取得链接地址中的文本String linkOuterH = link.outerHtml();// "<a href="http://itmyhome.com/"><b>blog</b></a>"String linkInnerH = link.html(); // "<b>blog</b>" 取得链接内的html内容System.out.println(text);System.out.println(linkHref);System.out.println(linkText);System.out.println(linkOuterH);System.out.println(linkInnerH); 打印: my blog link.http://itmyhome.com/blog<a href="http://itmyhome.com/"><b>blog</b></a><b>blog</b> 说明 上述方法是元素数据访问的核心办法。此外还其它一些方法可以使用: Element.id() Element.tagName() Element.className() and Element.hasClass(String className) 修改数据在解析文档的同时,我们可能会需要对文档中的某些元素进行修改,例如我们可以为文档中的所有图片增加可点击链接、修改链接地址或者是修改文本等。 下面是一些简单的例子: doc.select("div.comments a").attr("rel", "nofollow"); // 为所有链接增加 rel=nofollow 属性doc.select("div.comments a").addClass("mylinkclass"); // 为所有链接增加 class=mylinkclass 属性doc.select("img").removeAttr("onclick"); // 删除所有图片的 onclick 属性doc.select("input[type=text]").val(""); // 清空所有文本输入框中的文本 道理很简单,你只需要利用jsoup的选择器找出元素,然后就可以通过以上的方法来进行修改, 修改完直接调用 Element(s)的 html()方法就可以获取修改完的HTML文档。 HTML文档清理在做网站的时候,经常会提供用户评论的功能。有些不坏好意的用户,会搞一些脚本到评论内容中, 而这些脚本可能会破坏整个页面的行为,更严重的是获取一些机要信息,例如XSS跨站点攻击之类的。 使用jsoup HTML Cleaner 方法进行清除,看看下面这段代码: String unsafe = "<p><a href='http://itmyhome.com/' onclick='stealCookies()'>itmyhome</a></p>";String safe = Jsoup.clean(unsafe, Whitelist.basic());System.out.println(safe); //输出 : <p><a href="http://itmyhome.com/" rel="nofollow">itmyhome</a></p> jsoup使用一个Whitelist类用来对HTML文档进行过滤,该类提供几个常用方法:
|