52

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

div class = "classname"

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

クラスに 1 行の HTML を指定して、次のようないくつかの優れたメソッドを作成できる優れた方法はありますか。

boolean usesClass(String CSSClassname);
String getText();
String getLink();
4

11 に答える 11

60

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

http://jsoup.org/

于 2011-05-18T09:33:54.947 に答える
20

前のコメントで述べたように、主な問題は不正な 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();
        }
    }
}
于 2008-10-26T14:55:57.303 に答える
18

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

http://jtidy.sourceforge.net/

「JTidy は、HTML Tidy の Java ポートであり、HTML 構文チェッカーであり、きれいなプリンターです。Java 以外のいとこのように、JTidy は、不正な形式の不完全な HTML をクリーンアップするためのツールとして使用できます。さらに、JTidy は、これにより、実際の HTML の DOM パーサーとして JTidy を効果的に使用できるようになります。

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

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

于 2008-10-26T16:06:03.697 に答える
13

不正な HTML を処理できる Java HTML パーサーであるTagSoupに興味があるかもしれません。XML パーサーは、整形式の XHTML でのみ機能します。

于 2008-10-26T14:16:42.437 に答える
5

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

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

于 2011-01-21T18:36:15.027 に答える
5

HTMLParser プロジェクト ( http://htmlparser.sourceforge.net/ ) が考えられます。不正な HTML の処理に関してはかなりまともなようです。次のスニペットは、必要なことを行う必要があります。

Parser parser = new Parser(htmlInput);
CssSelectorNodeFilter cssFilter = 
    new CssSelectorNodeFilter("DIV.targetClassName");
NodeList nodes = parser.parse(cssFilter);
于 2008-10-26T14:23:12.173 に答える
4

HTMLUnit が役立つかもしれません。それはあまりにも多くのことを行います。

http://htmlunit.sourceforge.net/ 1

于 2008-10-26T19:16:21.550 に答える
4

Java の jQuery であるJerryを忘れないでください。これは、HTML ドキュメントの解析、トラバース、および操作を簡素化する高速で簡潔な Java ライブラリです。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
    }
});

もちろん、これらはすべてがどのように見えるかを理解するための簡単な例にすぎません。

于 2012-01-08T17:37:55.157 に答える
3

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

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

于 2011-08-19T00:13:16.177 に答える
1

XWiki HTML Cleanerも使用できます。

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

于 2011-10-04T15:54:20.710 に答える
0

HTML の形式が整っていれば、XML パーサーを簡単に使用して作業を行うことができます... 読むだけなら、SAXが理想的です。

于 2008-10-26T14:01:36.413 に答える