2010-08-04 7 views
3

J'ai obtenu du code de java httpurlconnection cutting off html et je suis à peu près le même code pour aller chercher du code HTML à partir de sites Web en Java. Sauf pour un site Web particulier que je ne suis pas capable de faire ce travail de code avec:Besoin d'aide pour obtenir HTML d'un site Web en Java

Je suis en train d'obtenir HTML à partir de ce site:

http://www.geni.com/genealogy/people/William-Jefferson-Blythe-Clinton/6000000001961474289

Mais je continue à recevoir des caractères indésirables . Bien que cela fonctionne très bien avec n'importe quel autre site Web comme http://www.google.com.

Et c'est le code que j'utilise:

public static String PrintHTML(){ 
    URL url = null; 
    try { 
     url = new URL("http://www.geni.com/genealogy/people/William-Jefferson-Blythe-Clinton/6000000001961474289"); 
    } catch (MalformedURLException e1) { 
     // TODO Auto-generated catch block 
     e1.printStackTrace(); 
    } 
    HttpURLConnection connection = null; 
    try { 
     connection = (HttpURLConnection) url.openConnection(); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    connection.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.6) Gecko/20100625 Firefox/3.6.6"); 
    try { 
     System.out.println(connection.getResponseCode()); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    String line; 
    StringBuilder builder = new StringBuilder(); 
    BufferedReader reader = null; 
    try { 
     reader = new BufferedReader(new InputStreamReader(connection.getInputStream())); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    try { 
     while ((line = reader.readLine()) != null) { 
      builder.append(line); 
      builder.append("\n"); 
     } 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    String html = builder.toString(); 
    System.out.println("HTML " + html); 
    return html; 
} 

Je ne comprends pas pourquoi il ne fonctionne pas avec l'URL que je l'ai mentionné ci-dessus.

Toute aide sera appréciée.

Répondre

7

Ce site génère incorrectement la réponse, quelles que soient les capacités du client. Normalement, un serveur ne devrait gziper la réponse que lorsque le client la prend en charge (par Accept-Encoding: gzip). Vous devez le décompresser en utilisant GZIPInputStream.

reader = new BufferedReader(new InputStreamReader(new GZIPInputStream(connection.getInputStream()), "UTF-8")); 

Notez que j'ai aussi ajouté le droit charset au constructeur InputStreamReader. Normalement, vous souhaitez l'extraire de l'en-tête Content-Type de la réponse. Pour plus d'astuces, voir aussi How to use URLConnection to fire and handle HTTP requests? Si tout ce que vous voulez après tout, c'est d'analyser/extraire des informations du HTML, alors je vous recommande vivement d'utiliser un HTML parser comme Jsoup à la place.

+1

Wow cela a fonctionné. Merci pour l'explication. Et un grand merci pour l'extrait aussi. J'ai d'abord essayé d'utiliser HTMLCleaner comme mon analyseur, mais j'avais le même problème. Maintenant, je vais nourrir cette chaîne HTML dans HTMLCleaner. – bits

+0

De rien. – BalusC

+0

BTW, jsoup (1.3.1) traite maintenant correctement cette sortie gzippée en utilisant 'Jsoup.connect (url) .get();' –

Questions connexes