jsoup入門

12489 ワード

jsoupはJavaのHTML解析器で、主にHTMLの解析に使われています.公式サイト   中国語ドキュメント
爬虫類の場合、HttpClientなどのフレームワークでWebソースを取得した後、Webソースから目的のコンテンツを取り出す必要があります.
jsoupのようなHTML解析器を使うことができます.とても簡単に実現できます.
 
jsoupは、あるアドレスから直接Webソースを取得することもサポートしていますが、HTTP、HTTPSプロトコルのみをサポートしており、サポートが豊富ではありません.
そのため、主にHTMLの解析に使われています.
◆ここで、解析するHTMLは、HTMLの文字列であってもよいし、URLであってもよいし、ファイルであってもよい.
org.jsoup.Jsoup入力したHTMLをorg.jsoup.nodes.Documentオブジェクトに変換し、Documentオブジェクトから目的の要素を取り出します.
org.jsoup.nodes.Documentはorg.jsoup.nodes.Elementを継承し、Elementはorg.jsoup.nodes.Nodeクラスを継承します.HTMLの要素を取得するための豊富な方法が提供されています.
 
◇HTML文字列の解析
String html = "First parse"
  + "

Parsed HTML into a doc.

"; Document doc = Jsoup.parse(html);

 
◇URLからHTMLを取得して解析
Document doc = Jsoup.connect("http://example.com/").get();
String title = doc.title();

ここで、Jsoup.connectionメソッドはorg.jsoup.connectionオブジェクトを返します.
Connectionオブジェクトでは、getまたはpostを実行してリクエストを実行できます.ただし、リクエストを実行する前に、
Connectionオブジェクトを使用して、リクエスト情報を設定できます.たとえば、ヘッダ情報、クッキー、リクエスト待ち時間、エージェントなど、ブラウザの動作をシミュレートします.
Document doc = Jsoup.connect("http://example.com")
  .data("query", "Java")
  .userAgent("Mozilla")
  .cookie("auth", "token")
  .timeout(3000)
  .post();

 
◇ファイルからHTMLを読み込んで解析
File input = new File("/tmp/input.html");
Document doc = Jsoup.parse(input, "UTF-8", "http://example.com/");

 
◆Documentオブジェクトを取得すると、次にDocumentオブジェクトを解析し、そこから私たちが望む要素を取得します.
Documentでは、指定した要素を取得するための豊富な方法が提供されています.
◇DOM方式で取得
getElementById(String id):idによるgetElementsByTag(String tagName):ラベル名によるgetElementsByClass(String className):クラス名によるgetElementsByAttribute(String key):属性名によるgetElementsByAttribute(String key):指定した属性名によるgetElementsByAttributeValue(String key,String value):属性値によるgetAllElements()の取得:すべての要素の取得
◇cssやjQueryのようなセレクタで要素を探す
 Elementクラスの次の方法を使用します.
    public Elements select(String cssQuery)
CSSまたはjQueryのようなセレクタ文字列を入力することで、指定した要素を検索します.
例:
File input = new File("/tmp/input.html");
Document doc = Jsoup.parse(input, "UTF-8", "http://example.com/");

Elements links = doc.select("a[href]"); //  href   a  
Elements pngs = doc.select("img[src$=.png]");
  //    .png   

Element masthead = doc.select("div.masthead").first();
  //class  masthead div  

Elements resultLinks = doc.select("h3.r > a"); // h3     a  

 
セレクタの詳細構文(org.jsoup.select.Selectorでセレクタの詳細構文を表示できます):
tagname:タグで要素を検索する、例えば:a ns|tag:タグでネーミングスペースで要素を検索する、例えば:fb|name構文で要素#idを検索する:IDで要素を検索する、例えば:#logo.class名で要素を検索する、例えば:.masthead[attribute]:属性で要素を検索する、例えば:[href][^attr]:属性名接頭辞を使用して要素を検索します.たとえば、[^data-]を使用してHTML 5 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.connt>pでp要素を検索するか、body>*でbodyラベルの下のすべての直接サブ要素siblingA+siblingB:A要素の前の最初の同級要素Bを検索します.例えば、div.head+div siblingA~siblingX:A要素を検索する前の同級X要素、例えば、h 1~p el,el,el:複数のセレクタの組み合わせで、いずれかのセレクタに一致する一意の要素を検索します.例えば、div.masthead,div.logo
擬似セレクタselectors:lt(n):DOMツリーで親ノードに対してどの要素の同級インデックス値がn未満であるかを検索します.たとえば、td:lt(3)は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、2番目のエレメントindexは1などです.
◆上のセレクタでは、ArrayListオブジェクトを継承したElementsオブジェクトを取得できます.中にはすべてElementオブジェクトが入っています.
次に私たちがしなければならないのは、Elementオブジェクトから、本当に必要な内容を取り出すことです.
通常、次の方法があります.
◇Element.text()
この方法は要素のテキストを取得するために使用されます.
◇Element.html()またはNode.outerHtml()
この方法は要素のhtmlコンテンツを取得するために使用されます.
◇Node.attr(String key)
属性の値を取得します.たとえば、ハイパーリンクのhrefの値を取得します.
 
 
◆HTMLクリーンアップ
org.jsoup.safety.Cleanerクラスのcleanメソッドを使用して、XSS攻撃を回避するためにHTMLを使用することができます.
例:
String unsafe = 
  "

Link

"; String safe = Jsoup.clean(unsafe, Whitelist.basic()); // now:

http://example.com/

" rel="nofollow">Link

 
◆総合例:
この例では、HttpClientと組み合わせてページのHTMLを抽出し、Jsoupを利用してページを分析し、極客トップの内容を抽出します.
package com.csdn;

import java.io.IOException;

import org.apache.http.HttpEntity;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

public class HttpClientJsoupTest01 {

    //url   "http://www.csdn.net/" 
    public void get(String url) {
        
        CloseableHttpClient client=HttpClients.createDefault();    //            
        
        HttpGet get=new HttpGet(url);                //    get  

        CloseableHttpResponse response=null;        //      
        
        try {
            response=client.execute(get);
            System.out.println(response.getStatusLine().getStatusCode());//       ,200    
            HttpEntity entity=response.getEntity();        //      
            String html=EntityUtils.toString(entity);    //            
            
            /**
             *       jsoup        html,   csdn             
             */
            Document document=Jsoup.parse(html);    //  Jsoup      , html     Document  
            Element element=document.select("div.wrap .left .hot_blog ul").first();    //  select   ,     li    
            Elements elements= element.select("a");    //  a     
            
            for (Element element2 : elements) {
                System.out.println("  :"+element2.attr("title")+"        -->>      :"+element2.attr("href"));
            }
            
        } catch (ClientProtocolException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }finally {
            try {
                response.close();
                client.close();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
}

GitHubダウンロード
 
転載先:https://www.cnblogs.com/zerotomax/p/7246815.html