2015-04-04 89 views
0

這是我的目標:給定一個預定義的頂級域名和一個通用搜索URL,並附帶一個作爲參數傳遞的輸入查詢,下載所述網站的源代碼並將其顯示在瀏覽器。使用Jersey,Tomcat和Java解析網站 - 編碼問題

最終,我將利用各種解析技術(substring,lol)來提取和封送JaxWS + POJOs的數據,但我需要查看原始HTML輸出以瞭解我的程序能夠正確理解其編碼。

我已經從一個Response返回一個簡單的字符串返回,因爲我得到了亂碼編碼。我試圖設置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(新URL的行少...)。

下面的示例響應:記住它是當前的字符串,不是響應返回,儘管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] q9i-

潛在的弧線球:我通過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,這樣的: <?xml version="1.0" encoding="UTF-8"?>

回答

0

的解決方案,我發現,而不是我想要的,是該網站負責發送亂碼。我嘗試了一個類似的網站,它按照預期返回了源代碼。

沒有指定的Cookie或用戶代理的數量會改變我的結果與第一個網站,所以我得出的結論是,這是來自抓取工具的故意數據混淆。