【问题标题】:Parsing a website with Jersey, Tomcat, and Java - Encoding issue使用 Jersey、Tomcat 和 Java 解析网站 - 编码问题
【发布时间】:2015-04-04 13:10:08
【问题描述】:

这是我的目标:给定一个预定义的顶级域和一个通用搜索 URL,并带有作为参数传递的附加输入查询,下载所述网站的源并将其显示在浏览器中。

最终,我将利用各种解析技术(子字符串、lol)来提取并使用 JaxWS + POJO 编组数据,但我需要查看原始 HTML 输出才能知道我的程序正确理解其编码。

我已经从响应返回变为简单的字符串返回,因为我得到了乱码编码。我试过设置编码 1000 种不同的方式,但这似乎并不重要。

注意:我还可以使用其他方法来编组数据等,但我已将问题减少到两种麻烦的方法。

public List<String> DownloadResultSource(URL url)
{
    List<String> source = new ArrayList<String>();
    BufferedReader br;
    String curLine = null;

    try
    {
        br = new BufferedReader(new InputStreamReader(url.openStream(), "UTF-8"));
        while((curLine = br.readLine()) != null)
        {
            source.add(curLine);
        }

        return source;
    }
    catch(Exception ex)
    {
        return null;
    }
}

@GET
@Path("/{parameter}")
//@Produces(MediaType.TEXT_HTML + ";charset=utf-8")
public String searchSites(@PathParam("parameter") String parameter,
        @DefaultValue("") @QueryParam("query") String query)
{           
        //crawl website with specified query
        Crawler crawler = new Crawler();

        //DEBUG
        Host host = hostEnum.STACKOVERFLOW.getHost();
        try
        {
            List<String> source = crawler.DownloadResultSource(new URL(host.getTopLevelDomain() + host.getDefaultSearch(query)));
            StringBuilder sb = new StringBuilder();
            sb.append(new URL(host.getTopLevelDomain() + host.getDefaultSearch(query)));
            for(String line : source)
            {
                sb.append(line);
            }
            return sb.toString();
            //return Response.status(Response.Status.OK).entity(sb.toString()).build();
        } 
        catch (Exception ex)
        {
            return ex.toString();
        }
        // end DEBUG

        // ORIGINAL return marshalResponse(crawler.SearchHost(hostEnum.STACKOVERFLOW, query));
    }

    return null;
}

就像我说的那样,我得到了乱码输出,减去我附加的原始 URL 的行 (sb.append(new URL...)。

下面的示例响应。请记住,当前它是 String,而不是 Response 返回,尽管 Response.....build() 产生相同的结果:

https://stackoverflow.com/search?q=my+search+query ��}yw�H��������n'�b_�9BKw��t����y�����$#Py��|��VHh9�[ ��AQw��������o�[�~�A�d��==!t3����6L��q�q}}��|�i ��R��/:��IT#Oa�={����'6"或����:��� �A�]��q9��i-

潜在的曲线球:我正在通过 Eclipse 在 Windows 上进行开发,尽管 Tomcat 服务器位于 Ubuntu 服务器上,但我使用 HTML 管理器来提升代码。也许 Ubuntu 缺乏对 UTF-8 的支持?我不这么认为,但我已经束手无策了。

编辑 - 更多信息: 该项目是一个Maven项目,这里是Pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>my package</groupId>
  <artifactId>my project</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <dependencies>
    <dependency>
        <groupId>com.sun.jersey</groupId>
        <artifactId>jersey-server</artifactId>
        <version>1.9</version>
    </dependency>
  </dependencies>
</project>

我的 Web.xml 指定 UTF-8,因此: &lt;?xml version="1.0" encoding="UTF-8"?&gt;

【问题讨论】:

    标签: java tomcat encoding jersey response


    【解决方案1】:

    我找到的解决方案,不是我想要的,是网站负责将乱码发回。我尝试了一个类似的网站,它按预期返回了源代码。

    没有多少指定的 cookie 或用户代理会改变我在第一个网站上的结果,所以我得出的结论是,这是爬虫故意混淆数据。

    【讨论】:

      猜你喜欢
      • 2014-12-19
      • 2013-02-02
      • 2023-04-09
      • 2012-06-11
      • 2021-01-30
      • 2023-03-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多