0

私のアプリケーションでは、Web サイトを解析し、いくつかのデータを ir からデータベースに保存する必要があります。ページのコンテンツを取得するために HttpClient を使用しています。私のコードは次のようになります。

        HttpClient client = new DefaultHttpClient();
        System.out.println(doc.getUrl());
        HttpGet contentGet= new HttpGet(siteUrl + personUrl);
        HttpResponse response = client.execute(contentGet);

        String html =  convertStreamToString(response.getEntity().getContent());

       /*
          parse the page
       */

    /***********************************************************************/

    public static String convertStreamToString(InputStream is) throws Exception {
    BufferedReader reader = new BufferedReader(new InputStreamReader(is));
    StringBuilder sb = new StringBuilder();
    String line = null;
    while ((line = reader.readLine()) != null) {
      sb.append(line + "\n");
    }
    is.close();
    return sb.toString();
}

私はループでこれをやっています - 私はいくつかのページのコンテンツを取得しようとしています (それらの構造は同じです)。うまく動作することもありますが、残念ながら、多くの場合、私の応答は、次のような似たようなゴミのシーケンスです。

�=�v7���9�Hdz$�d7/�$�st��؎I��X^�$A6t_D���!gr�����C^��k@��MQ�2�d�8�]

どこに問題があるのか​​ わかりません、助けてください。


受け取ったすべての応答のヘッダーを表示しました。正しいものには、次のものがあります。

Server : nginx/1.0.13
Date : Sat, 23 Mar 2013 21:50:31 GMT
Content-Type : text/html; charset=utf-8
Transfer-Encoding : chunked
Connection : close
Vary : Accept-Encoding
Expires : Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control : no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma : no-cache
Set-Cookie : pfSC=1; path=/; domain=.profeo.pl
Set-Cookie : pfSCvp=deleted; expires=Thu, 01-Jan-1970 00:00:01 GMT; path=/; domain=.profeo.pl

間違っている場合:

Server : nginx/1.2.4
Date : Sat, 23 Mar 2013 21:50:33 GMT
Content-Type : text/html
Transfer-Encoding : chunked
Connection : close
Set-Cookie : pfSCvp=3cff2422fd8f9b6e57e858d3883f4eaf; path=/; domain=.profeo.pl
Content-Encoding : gzip

他の提案はありますか?ここでは、この gzip エンコーディングが問題になっていると思いますが、どうすればよいでしょうか?

4

2 に答える 2

2

これはおそらく、JVMのデフォルトとは異なる文字エンコードを応答に使用している一部のWebサイトに関係しています。InputStreamsによって提供されるような生のバイトストリームから文字ストリーム(または文字列)に変換するには、文字エンコードを選択する必要があります。HTTP応答はさまざまなエンコーディングを使用できますが、通常、使用しているエンコーディングがわかります。HttpResponseの「Content-Encoding」ヘッダーを見つけることでこれを手動で行うことができますが、これは一般的なニーズであるため、ライブラリにはこれを行うためのユーティリティが用意されています。これはEntityUtilsクラスにあり、次のように使用できます。

String html = EntityUtils.toString(response.getEntity());

追加する必要があります

import org.apache.http.util.EntityUtils;

それが機能するようにファイルの先頭に移動します。

それでも問題が解決しない場合は、取得するURLの一部がテキストではなくバイナリである可能性があります。この場合、実行しようとしていることは意味がありません。その場合は、次のContent-Typeようにヘッダーを確認することで、テキスト応答とバイナリ応答を区別することができます。

boolean isTextual = response.getFirstHeader("Content-Type").getValue().startsWith("text");

新素材:

質問に追加したHTTPヘッダーを確認したところ、これは応答のgzip圧縮が原因であると推測されます。この質問でこれに対処する方法の詳細を見つけることができますが、短いバージョンでは、DefaultHttpClientの代わりにContentEncodingHttpClientを使用してみてください。

別の編集:ContentEncodingHttpClientは非推奨になり、代わりにDecompressingHttpClientを使用することになっています。

于 2013-03-23T20:37:20.550 に答える
0

圧縮を使用しない httpclient が必要です。私はこのHttpClientBuilder.create().disableContentCompression().build()httpclientを使用します

于 2014-05-14T07:57:11.103 に答える