web-dev-qa-db-ja.com

Java HTML解析

私はウェブサイトからデータをスクレイピングするアプリに取り組んでいますが、データを取得する方法について疑問に思っていました。具体的には、特定のCSSクラスを使用する多数のdivタグに含まれるデータが必要です-現在(テスト目的で)確認しているのは

div class = "classname"

hTMLの各行で-これは機能しますが、もっと良い解決策があると感じずにはいられません。

クラスにHTMLの行を指定し、次のようないくつかのNiceメソッドを使用できる素敵な方法はありますか?

boolean usesClass(String CSSClassname);
String getText();
String getLink();
52
Richard Walton

数年前、私は同じ目的でJTidyを使用しました。

http://jtidy.sourceforge.net/

「JTidyは、HTML TidyのJavaポートです。HTML構文チェッカーおよびプリティプリンターです。Java以外の従兄弟と同様に、JTidyは、不正なHTMLをクリーンアップするためのツールとして使用できます。さらに、JTidyは、処理中のドキュメントにDOMインターフェイスを提供します。これにより、実際にHTMLのDOMパーサーとしてJTidyを効果的に使用できます。

JTidyはAndy Quickによって書かれました。AndyQuickは後にメンテナーの地位を辞任しました。現在、JTidyはボランティアのグループによって管理されています。

JTidyの詳細については、JTidy SourceForgeプロジェクトページを参照してください。

18
user31586

HTML処理に役立つ可能性のある別のライブラリはjsoupです。 Jsoupは、不正な形式のHTMLをクリーンアップしようとし、jQueryのようなタグセレクター構文を使用して、JavaでのHTML解析を許可します。

http://jsoup.org/

59
rajsite

前述のコメントで述べられている主な問題は、不正なHTMLです。そのため、HTMLクリーナーまたはHTML-XMLコンバーターが必須です。 XMLコード(XHTML)を取得したら、それを処理するツールがたくさんあります。必要なデータのみを抽出する単純なSAXハンドラー、または元のコードを変更できるツリーベースのメソッド(DOM、JDOMなど)で取得できます。

HTMLクリーナー を使用して特定のクラスを使用するすべてのDIVを取得し、その中のすべてのテキストコンテンツを印刷するサンプルコードを次に示します。

import Java.io.IOException;
import Java.net.URL;
import Java.util.ArrayList;
import Java.util.Iterator;
import Java.util.List;

import org.htmlcleaner.HtmlCleaner;
import org.htmlcleaner.TagNode;

/**
 * @author Fernando Miguélez Palomo <fernandoDOTmiguelezATgmailDOTcom>
 */
public class TestHtmlParse
{
    static final String className = "tags";
    static final String url = "http://www.stackoverflow.com";

    TagNode rootNode;

    public TestHtmlParse(URL htmlPage) throws IOException
    {
        HtmlCleaner cleaner = new HtmlCleaner();
        rootNode = cleaner.clean(htmlPage);
    }

    List getDivsByClass(String CSSClassname)
    {
        List divList = new ArrayList();

        TagNode divElements[] = rootNode.getElementsByName("div", true);
        for (int i = 0; divElements != null && i < divElements.length; i++)
        {
            String classType = divElements[i].getAttributeByName("class");
            if (classType != null && classType.equals(CSSClassname))
            {
                divList.add(divElements[i]);
            }
        }

        return divList;
    }

    public static void main(String[] args)
    {
        try
        {
            TestHtmlParse thp = new TestHtmlParse(new URL(url));

            List divs = thp.getDivsByClass(className);
            System.out.println("*** Text of DIVs with class '"+className+"' at '"+url+"' ***");
            for (Iterator iterator = divs.iterator(); iterator.hasNext();)
            {
                TagNode divElement = (TagNode) iterator.next();
                System.out.println("Text child nodes of DIV: " + divElement.getText().toString());
            }
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }
    }
}
20

TagSoup 、a Java不正なHTMLを処理できるHTMLパーサー。XMLパーサーは、整形式のXHTMLでのみ機能します。

13
PhiLho

ジェリコ: http://jericho.htmlparser.net/docs/index.html

使いやすく、整形式ではないHTML、多くの例をサポートしています。

5
FolksLord

HTMLParserプロジェクト( http://htmlparser.sourceforge.net/ )が可能性があります。不正な形式のHTMLの処理はかなりまともなようです。次のスニペットは必要なことを行う必要があります。

Parser parser = new Parser(htmlInput);
CssSelectorNodeFilter cssFilter = 
    new CssSelectorNodeFilter("DIV.targetClassName");
NodeList nodes = parser.parse(cssFilter);
5
dave

HTMLUnitが役立つ場合があります。さらに多くのことを行います。

http://htmlunit.sourceforge.net/1

4
alex

Jerry 、JavaでのjQuery:速くて簡潔なJava HTMLドキュメントの解析、トラバース、および操作を簡素化するライブラリ。css3セレクターの使用を含みます。

例:

Jerry doc = jerry(html);
doc.$("div#jodd p.neat").css("color", "red").addClass("ohmy");

例:

doc.form("#myform", new JerryFormHandler() {
    public void onForm(Jerry form, Map<String, String[]> parameters) {
        // process form and parameters
    }
});

もちろん、これらはすべてがどのように見えるかを理解するためのほんの一例です。

4
igr

nu.validator プロジェクトは、優れた高性能のHTMLパーサーであり、正確性を損なうことはありません。

Validator.nu HTMLパーサーは、JavaのHTML5解析アルゴリズムの実装です。パーサーは、XMLパーサーですでにXHTML 1.xコンテンツをサポートし、SAX、DOM、またはXOMを使用してパーサーとインターフェイスするアプリケーションで、XMLパーサーのドロップイン置換として機能するように設計されています。低レベルの機能は、独自のIOを実行し、スクリプトでdocument.write()をサポートします。パーサーコアはGoogle Web Toolkitでコンパイルされ、C++に自動的に変換できます。 (C++の翻訳機能は、現在Geckoで使用するパーサーの移植に使用されています。)

3
Mike Samuel

XWiki HTML Cleaner を使用することもできます:

HTMLCleaner を使用し、拡張して有効なXHTML 1.1コンテンツを生成します。

1
Vincent Massol

HTMLが整形式の場合、XMLパーサーを使用して簡単にジョブを実行できます...読み取りのみの場合、 [〜#〜] sax [〜#〜] 理想的です。

0
Yuval