Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
不正确的Java HttpClient';s响应流_Java_Http_Stream_Html Parsing_Httpclient - Fatal编程技术网

不正确的Java HttpClient';s响应流

不正确的Java HttpClient';s响应流,java,http,stream,html-parsing,httpclient,Java,Http,Stream,Html Parsing,Httpclient,在我的应用程序中,我需要解析一个网站,并将一些数据从ir保存到数据库中。我正在使用HttpClient获取页面内容。我的代码如下所示: HttpClient client = new DefaultHttpClient(); System.out.println(doc.getUrl()); HttpGet contentGet= new HttpGet(siteUrl + personUrl); HttpResponse resp

在我的应用程序中,我需要解析一个网站,并将一些数据从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编码在这里是个问题,但我能做些什么呢?

这可能与某些网站在响应中使用不同于JVM默认的字符编码有关。要将原始字节流(如InputStreams提供的字节流)转换为字符流(或字符串),必须选择字符编码。HTTP响应可以使用不同的编码,但它们通常会告诉您它们使用的编码。您可以通过查找HttpResponse的“Content Encoding”头来手动执行此操作,但您的库提供了一个用于执行此操作的实用程序,因为这是一种常见的需要。它可以在类中找到,您可以这样使用它:

String html = EntityUtils.toString(response.getEntity());
你必须加上

import org.apache.http.util.EntityUtils;
到你文件的顶部,这样才能工作

如果这没有帮助,另一种可能是,您正在检索的一些URL是二进制的,而不是文本的,在这种情况下,您试图做的事情没有意义。如果是这种情况,您可以通过检查
内容类型
标题来区分文本响应和二进制响应,如下所示:

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

在查看了添加到问题中的HTTP头之后,我的最佳猜测是这是由响应的gzip压缩引起的。您可以在中找到有关如何处理此问题的更多信息,但简短的版本是,您应该尝试使用而不是DefaultHttpClient


另一个编辑:ContentEncodingHttpClient现在已不推荐使用,您应该改为使用。

您需要一个不使用压缩的httpclient。
我使用了这个
HttpClientBuilder.create().disableContentCompression().build()
httpclient

我按照您的建议使用了EntityUtils,并对20个类似的页面运行了它。我还显示了IStextal变量的值。20页中有2页的回复是正确的HTML,另外18页我再次收到垃圾。对于他们所有人来说,IStextal的价值都是真实的。例如-页面已成功接收,但未成功接收。我不知道怎么了,这几页几乎一模一样。非常感谢!我花了很多时间想弄明白,现在终于成功了!