120

Web ページの html を取得して に保存できるようにしたいStringので、処理を行うことができます。また、さまざまな種類の圧縮をどのように処理できますか。

Javaを使用してそれを行うにはどうすればよいですか?

4

11 に答える 11

179

Jsoupのような適切な HTML パーサーを使用します。次に、次のように簡単です。

String html = Jsoup.connect("http://stackoverflow.com").get().html();

GZIP およびチャンク化された応答と文字エンコーディングを完全に透過的に処理します。jQuery でできるように、HTMLトラバースやCSS セレクターによる操作など、より多くの利点も提供します。Documentとしてではなく、として取得するだけStringです。

Document document = Jsoup.connect("http://google.com").get();

それを処理するために、基本的な String メソッドを実行したり、HTML で正規表現を実行したりする必要はありません

以下も参照してください。

于 2010-12-31T17:57:30.997 に答える
113

これは、JavaのURLクラスを使用してテストされたコードです。ただし、例外を処理したり、コールスタックに渡したりするという、ここで行うよりも優れた作業を行うことをお勧めします。

public static void main(String[] args) {
    URL url;
    InputStream is = null;
    BufferedReader br;
    String line;

    try {
        url = new URL("http://stackoverflow.com/");
        is = url.openStream();  // throws an IOException
        br = new BufferedReader(new InputStreamReader(is));

        while ((line = br.readLine()) != null) {
            System.out.println(line);
        }
    } catch (MalformedURLException mue) {
         mue.printStackTrace();
    } catch (IOException ioe) {
         ioe.printStackTrace();
    } finally {
        try {
            if (is != null) is.close();
        } catch (IOException ioe) {
            // nothing to see here
        }
    }
}
于 2008-10-26T21:09:39.497 に答える
27

ビルの答えは非常に良いですが、圧縮やユーザーエージェントなどのリクエストでいくつかのことをしたいかもしれません。次のコードは、リクエストに対してさまざまなタイプの圧縮を行う方法を示しています。

URL url = new URL(urlStr);
HttpURLConnection conn = (HttpURLConnection) url.openConnection(); // Cast shouldn't fail
HttpURLConnection.setFollowRedirects(true);
// allow both GZip and Deflate (ZLib) encodings
conn.setRequestProperty("Accept-Encoding", "gzip, deflate");
String encoding = conn.getContentEncoding();
InputStream inStr = null;

// create the appropriate stream wrapper based on
// the encoding type
if (encoding != null && encoding.equalsIgnoreCase("gzip")) {
    inStr = new GZIPInputStream(conn.getInputStream());
} else if (encoding != null && encoding.equalsIgnoreCase("deflate")) {
    inStr = new InflaterInputStream(conn.getInputStream(),
      new Inflater(true));
} else {
    inStr = conn.getInputStream();
}

ユーザー エージェントも設定するには、次のコードを追加します。

conn.setRequestProperty ( "User-agent", "my agent name");
于 2010-04-06T05:17:00.170 に答える
13

URLURLConnectionなどの組み込みライブラリを使用することもできますが、それらはあまり制御できません。

個人的には、Apache HTTPClientライブラリを使用します。
編集: HTTPClient はApache によってサポート終了に設定されています。代替は次のとおりです: HTTP コンポーネント

于 2008-10-26T20:20:45.307 に答える
9

上記のすべてのアプローチは、ブラウザーで表示される Web ページのテキストをダウンロードしません。最近では、多くのデータが HTML ページのスクリプトを介してブラウザーに読み込まれます。上記の手法はいずれもスクリプトをサポートしておらず、html テキストのみをダウンロードするだけです。HTMLUNIT は JavaScript をサポートしています。したがって、ブラウザで表示される Web ページのテキストをダウンロードする場合は、HTMLUNITを使用する必要があります。

于 2014-05-30T10:30:16.080 に答える
0

Unix/Linux ボックスでは 'wget' を実行するだけで済みますが、クロスプラットフォーム クライアントを作成している場合、これは実際にはオプションではありません。もちろん、これは、ダウンロードした時点からディスクにヒットするまでの間、ダウンロードしたデータに対してあまり多くのことをしたくないことを前提としています。

于 2008-10-26T20:43:45.667 に答える
0

Jetty には、Web ページのダウンロードに使用できる HTTP クライアントがあります。

package com.zetcode;

import org.eclipse.jetty.client.HttpClient;
import org.eclipse.jetty.client.api.ContentResponse;

public class ReadWebPageEx5 {

    public static void main(String[] args) throws Exception {

        HttpClient client = null;

        try {

            client = new HttpClient();
            client.start();
            
            String url = "http://example.com";

            ContentResponse res = client.GET(url);

            System.out.println(res.getContentAsString());

        } finally {

            if (client != null) {

                client.stop();
            }
        }
    }
}

この例では、単純な Web ページのコンテンツを印刷します。

Java で Web ページを読むチュートリアルでは、URL、JSoup、HtmlCleaner、Apache HttpClient、Jetty HttpClient、および HtmlUnit を使用して Java でプログラムによって Web ページをダウンロードする 6 つの例を記述しました。

于 2016-08-18T16:42:58.213 に答える