57

ええと、私はWebページから情報を引き出し、それを私のプログラム(Javaで)に取り込む方法をかなり理解しようとしています。

たとえば、情報が必要な正確なページがわかっている場合、わかりやすくするために、Best Buyのアイテムページから、そのページから必要な適切な情報を取得するにはどうすればよいですか。タイトル、価格、説明のように?

このプロセスは何と呼ばれるでしょうか?私はこれを研究し始めることすら考えていませんでした。

編集:さて、私はJSoup(BalusCによって投稿されたもの)のテストを実行していますが、このエラーが発生し続けます:

Exception in thread "main" java.lang.NoSuchMethodError: java.util.LinkedList.peekFirst()Ljava/lang/Object;
at org.jsoup.parser.TokenQueue.consumeWord(TokenQueue.java:209)
at org.jsoup.parser.Parser.parseStartTag(Parser.java:117)
at org.jsoup.parser.Parser.parse(Parser.java:76)
at org.jsoup.parser.Parser.parse(Parser.java:51)
at org.jsoup.Jsoup.parse(Jsoup.java:28)
at org.jsoup.Jsoup.parse(Jsoup.java:56)
at test.main(test.java:12)

私はApacheCommonsを持っています

4

10 に答える 10

103

Jsoupなどの HTML パーサーを使用します。これは、 CSS セレクターのようなjQueryをサポートするため、Java で利用可能な他の HTML パーサーよりも優先されます。また、ノードのリストを表すクラス が実装されているため、強化された for ループで繰り返し処理できます (そのため、平均的な Java DOM パーサーで冗長なクラスや類似のクラスに煩わされる必要はありません)。 ElementsIterableNodeNodeList

基本的なキックオフの例を次に示します (最新の Jsoup JAR ファイルをクラスパスに配置するだけです)。

package com.stackoverflow.q2835505;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

public class Test {

    public static void main(String[] args) throws Exception {
        String url = "https://stackoverflow.com/questions/2835505";
        Document document = Jsoup.connect(url).get();

        String question = document.select("#question .post-text").text();
        System.out.println("Question: " + question);

        Elements answerers = document.select("#answers .user-details a");
        for (Element answerer : answerers) {
            System.out.println("Answerer: " + answerer.text());
        }
    }

}

ご想像のとおり、これにより、自分の質問とすべての回答者の名前が出力されます。

于 2010-05-14T15:53:50.500 に答える
10

これはスクリーン スクレイピングと呼ばれます。ウィキペディアには、より具体的なWeb スクレイピングに関する記事があります。これは大きな課題になる可能性があります。なぜなら、見苦しい、ごちゃごちゃした、ブラウザーに適していない場合は壊れている HTML が世の中にあるからです。頑張ってください。

于 2010-05-14T15:53:15.590 に答える
6

JTidyを使用します。これは JSoup と似ていますが、JSoup についてはよくわかりません。JTidy は壊れた HTML を処理し、w3c ドキュメントを返すので、これを XSLT のソースとして使用して、本当に関心のあるコンテンツを抽出できます。XSLT がわからない場合は、Documentモデルは w3c よりも使いやすいです。

編集: JSoup の Web サイトをざっと見てみると、JSoup の方が確かに良い選択であることがわかります。ドキュメントから要素を抽出するための CSS セレクターをすぐにサポートしているようです。これは、XSLT を使用するよりもはるかに簡単に作業できます。

于 2010-05-14T15:57:20.187 に答える
4

html パーサーを使用できます (多くの便利なリンクがここにあります: Java html パーサー)。

このプロセスは「ウェブサイトのコンテンツを取得する」と呼ばれます。さらに詳しく調べるには、「grab website content java」を検索してください。

于 2010-05-14T15:53:04.420 に答える
3

jsoup は Java 1.5 をサポートします

https://github.com/tburch/jsoup/commit/d8ea84f46e009a7f144ee414a9fa73ea187019a3

そのスタックはバグだったようで、修正されました

于 2011-09-19T17:09:46.797 に答える
2

HTML を調べて、一意でテキストに近い文字列を見つけられるかどうかを確認してから、line/char-offsets を使用してデータを取得できます。

System.XML.LinqC# に見られるような XML クラスがない場合、Java では扱いにくい可能性があります。

于 2010-05-14T15:53:23.060 に答える
2

jARVESTを試すこともできます。

純粋な Java エンジンを介した JRuby DSL に基づいており、Web サイトをスパイダー スクレイプ変換します。

Web ページ内のすべてのリンクを検索します (wgetおよびxpathjARVEST の言語の構成要素です)。

wget | xpath('//a/@href')

Java プログラム内:

Jarvest jarvest = new Jarvest();
  String[] results = jarvest.exec(
    "wget | xpath('//a/@href')", //robot! 
    "http://www.google.com" //inputs
  );
  for (String s : results){
    System.out.println(s);
  }
于 2012-07-11T22:47:51.953 に答える
1

JSoup ソリューションは素晴らしいですが、本当に単純なものだけを抽出する必要がある場合は、正規表現または String.indexOf を使用する方が簡単かもしれません

他の人がすでに述べたように、このプロセスはスクレイピングと呼ばれます

于 2010-05-14T18:20:14.887 に答える
-1

cURL ライブラリを調べます。Java で使用したことはありませんが、バインディングが必要なことは確かです。基本的に、「スクレイピング」したいページに cURL リクエストを送信します。リクエストは、ソース コードを含む文字列をページに返します。そこから、正規表現を使用して、ソース コードから必要なデータを解析します。それは一般的にあなたがそれを行う方法です。

于 2010-05-14T15:53:13.217 に答える