ホームページ  >  記事  >  ウェブフロントエンド  >  jsoup は HTML を解析します information_html/css_WEB-ITnose

jsoup は HTML を解析します information_html/css_WEB-ITnose

WBOY
WBOYオリジナル
2016-06-24 11:26:391170ブラウズ

jsoup の概要

jsoup は、URL アドレスと HTML テキスト コンテンツを直接解析できる Java HTML パーサーです。非常に省力的な API を提供しており、

DOM、CSS、および jQuery のような操作メソッドを通じてデータを取得および操作できます。

jsoup の主な機能は次のとおりです

  • 1. URL、ファイル、または文字列から HTML を解析します

  • 2. DOM または CSS セレクターを使用してデータを検索し、取得します
  • 3.属性、テキスト
  • jsoup のメインクラス階層を図に示します。
  • ドキュメント入力

    jsoup は、文字列、URL アドレス、ローカル ファイルから HTML ドキュメントをロードし、Document オブジェクト インスタンスを生成できます。

    // 直接从字符串中输入 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 に変換されます。

    データ抽出

    DOM メソッドを使用してドキュメントを走査する

    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);}

    Print

    itmyhome.com, helloblog.itmyhome.com, jsoup

    Description

    Elements このオブジェクトは、要素を検索し、要素内のデータを抽出して処理するための一連の DOM のようなメソッドを提供します。詳細は次のとおりです:

    要素を検索

    getElementById(String id)
  • getElementsByTag(String tag)
  • getElementsByClass(String className)
  • getElementsByAttribute(String key) (および関連する)メソッド)
  • 要素の兄弟: siblingElements()、firstElementSibling()、lastElementSibling(); nextElementSibling()、previousElementSibling()
  • グラフ:parent()、children()、child(intindex)
  • 要素データ

    attr(String key) 属性の取得 attr(String key, String value) 属性の設定
  • attributes() すべての属性の取得
  • id()、className()、classNames()
  • text() テキスト内容を取得します text(String value) テキスト内容を設定します
  • html() 要素内の HTML html (String 値)を取得します 要素内に HTML コンテンツを設定します
  • outerHtml( ) 要素の外側の HTML コンテンツを取得します
  • data() データ コンテンツ (例: script タグや style タグ) を取得します
  • tag() および tagName()
  • HTML とテキストを操作します

    append(String html)、prepend(String html)
  • appendText(String text)、prependText(String text)
  • appendElement(String tagName)、prependElement(String tagName)
  • html(String value)
  • セレクター構文を使用して要素を検索する
  • 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 は要素を取得するために jQuery と同じセレクターを使用することがわかります

    次の表は、jsoup のすべての構文の詳細なリストです。 jsoup セレクター。

    表 1. 基本的な使用法:

    タグ名 ns|tag などのタグ名を使用して検索します。 a0e98eb7c0de3c589b060f1cebad24c0 要素 #logo などの要素 ID を使用して検索します .head などの要素のクラス属性を使用して検索します 要素の属性を使用して検索すること (例: [href]) は、href 属性を持つすべての要素を取得することを意味します 検索する要素の属性名のプレフィックスを使用します。たとえば、[^data-] は次のように使用されます。 HTML5 のデータセット属性を検索します 位置決めに属性値を使用します。たとえば、幅属性値 500 を持つすべての要素を検索するには [width=500] これら 3 つの構文はそれぞれ、属性が value で始まり、value で終わり、 を含むことを表します。 img[src~=( ?i).(png|jpe?g)] などの属性値をフィルターする式 すべての要素を配置

    上記は最も基本的なセレクター構文です。これらの構文は組み合わせて使用​​することもできます。jsoup でサポートされている組み合わせは次のとおりです。 a#logo などの特定の要素の id 値 -> 04a94c296cfaac560c4e280f51ff119e

    el.class

    #id
    .class
    [attribute]え]
    [^attr]
    [attr=value]
    [attr^ =value]、[attr$=value]、[attr *=value]
    [attr~=regex]
    *
    div.head などのクラスを配置します。 ->
    これら 5 つは、親子関係、マージ関係、階層関係を含む要素間の結合関係を表すセレクター構文です。 兄弟 A ~ 兄弟 X エル、エル、エル いくつかの基本的な構文と組み合わせに加えて、jsoup は次の使用もサポートしています。式 式を使用して要素をフィルタリングして選択します。以下は、jsoup でサポートされるすべての式のリストです。 :lt(n) たとえば、 td:lt(3) は 3 列未満を意味します :gt(n ) div p:gt(2) は div に 2 つ以上の p が含まれていることを意味します :eq(n)
    ancestor child
    親 > 子
    兄弟 A + 兄弟 B
    表 3: 式:
    form input:eq(1) は 1 つの入力のみを含むフォームを意味します

    :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文档进行过滤,该类提供几个常用方法:

    none() 只允许包含文本信息
    basic() 允许的标签包括: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



    作者:itmyhome

    声明:
    この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。