2010-07-08 6 views
1

OK je donc redéfinie mon dernier programme ... la voici:Java - Lire un site et non la source

import java.io.BufferedReader; 
import java.io.InputStreamReader; 
import java.net.URL; 
import java.net.URLConnection; 


public class asp { 
    public static void main(String[] args) { 
     try { 
      URL game = new URL("http://localhost/mystikrpg/post.php?players"); 
      URLConnection connection = game.openConnection(); 
      BufferedReader in = new BufferedReader(new 
      InputStreamReader(connection.getInputStream())); 
      String inputLine; 
      while ((inputLine = in.readLine()) != null) { 
       System.out.println(inputLine); 
      } 
      in.close(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 
} 

Le problème? Quand je le lance ... je reçois la page ENTIER ... MÊME LA SOURCE DE CODE comme le début de la balise html jusqu'à la fin du corps et la balise html.

Quand vraiment ... Je veux à la sortie est le 1 .... La seule façon je peux le voir est si je divise la chaîne de <body> et </body> ...

Meh. Aidez-moi?

+0

À quoi ressemble le site que vous analysez? Postez la source – bwawok

+8

si vous ne voulez pas la source que voulez-vous? Thats ce que la page "est" –

+2

La source est le site Web. Les navigateurs Web font beaucoup de travail pour normaliser la source reçue à partir d'une demande donnée et la formater d'une manière agréable pour l'utilisateur. Vous devrez aussi analyser le DOM HTML pour extraire les données que vous voulez. –

Répondre

12

Le problème? Quand je le lance ... je reçois la page ENTIER ... MÊME LA SOURCE DE CODE comme le début de la balise html jusqu'à la fin du corps et la balise html.

Eh bien, c'est essentiellement ce qu'est une page HTML; c'est ce que vous obtenez. Maintenant, si vous ne voulez pas analyser le contenu manuellement, utilisez un analyseur HTML. Il y a many of them mais je recommanderais Jsoup, une des bibliothèques les plus élégantes disponibles (API propre et agréable, jQuery like CSS selectors, itération d'éléments non verbeux, etc.). Démo:

import org.jsoup.Jsoup; 
import org.jsoup.nodes.Document; 

public class JsoupDemo { 
    public static void main(String[] args) throws Exception { 
     URL url = new URL("http://localhost/mystikrpg/post.php?players"); 
     Document doc = Jsoup.parse(url, 3*1000); 

     String text = doc.body().text(); 

     System.out.println(text); // outputs 1 
    } 
} 

Regardez Ma, pas de mains! PS: En note, je dois dire que je suis d'accord avec d'autres réponses ici, vous devriez peut-être envisager de produire autre chose que du HTML comme XML, JSON ou même du texte brut (au moins comme une alternative à la version HTML si vous en avez vraiment besoin).

+0

Jsoup ressemble à une bonne bibliothèque.Merci d'avoir partagé. –

5

Lorsque vous demandez une page que vous obtenez la source. C'est ce qui est attendu et normal. Vous devrez analyser cette source pour extraire le contenu.

1

Lorsque vous récupérez une page web, ce que le serveur vous envoie est tout entre les balises HTML, et plus encore.

Je pense que ce que vous cherchez est un analyseur HTML, qui vous permettra d'extraire le contenu de la page Web. D'abord, vous récupérez la page Web comme vous le faites actuellement, puis exécutez la sortie via l'analyseur, en demandant à l'analyseur d'extraire la partie que vous voulez.

Voici quelques HTML parseurs:

8

Sauf si vous avez le contrôle sur post.php et sont en mesure de faire revenir tout ce dont vous avez besoin sans les balises HTML (à la web services), vous w Je dois analyser le document HTML retourné par lui.

Utilisez un HTML Parser, les expressions régulières ne sont pas très fiables pour cela.


rugueux Snippet pour analyser la balise <body> avec HTMLParser:

(Assurez-vous d'inclure htmlparser.jar)

import org.htmlparser.Node; 
import org.htmlparser.Parser; 
import org.htmlparser.util.NodeList; 
import org.htmlparser.util.ParserException;  
import org.htmlparser.filters.TagNameFilter; 
import org.htmlparser.tags.BodyTag;  

public class HTMLParserTest { 
    public static String grabBodyTag (String url) { 
     if(!url.startsWith("http://")){url = "http://" + url;}  
     Parser parser = new Parser();    
     TagNameFilter filter = new TagNameFilter("body");  
     try { 
      parser.setResource(url); 
      NodeList list = parser.parse(filter); 
      Node node = list.elementAt(0);   
      if (node instanceof BodyTag) { 
       BodyTag tag = (BodyTag) node; 
       return tag.toPlainTextString(); //other formats are available 
      } 
     } catch (ParserException e) { 
      e.printStackTrace(); 
     }  
     return "found no body tag..."; 
    } 
    public static void main(String... args){ 
     System.out.println(grabBodyTag("google.com")); 
    } 

} 

Cela donne une String avec « Web Images Vidéos Maps News Books Gmail plus ... "[omis], dans votre cas, il retournera un String avec "1" en elle éventuellement avec des espaces dedans (comme le montre votre pastebin), vous devez trim et ensuite faire la conversion en un nombre.

clôture Note: faire un post.php avec (et seulement) le code suivant vous rendra la vie beaucoup plus facile si vous n'avez pas besoin de ce script pour toute autre chose que de retourner ce résultat.Scraping stuff hors de la réponse au format HTML est désagréable, et peut fragiliser votre code.

<?php 
$number = 1; // or whatever login to get it. 
echo $number; 
?> 
+0

+! pour mentionner avoir le contrôle sur post.php. L'OP peut certainement lui rendre la vie beaucoup plus facile s'il ne fait que copier du texte à la suite de la demande. –

+0

Oui, j'ai le contrôle sur post.php mais euh ... ok. Cet exemple que vous m'avez donné ... n'a pas fonctionné. J'obtiens des choses comme l'analyseur syntaxique de Parser non trouvé. – nn2

+0

@Pouvez-vous comprendre que pour utiliser une bibliothèque (HTMLParser), vous devez l'inclure dans votre projet pour être "trouvé"? Cet extrait est ce que j'utilise et il fonctionne très certainement ** pour saisir les balises body. Si vous avez le contrôle sur 'post.php', faites simplement' echo 'au format texte ";' sans le reste du document HTML, et vous obtiendrez le résultat en tant que 'String' avec votre extrait de connexion URL. – bakkal

3

Peut-être que la webapp/site Web que vous essayez de parler a d'autres façons de fournir les réponses; par exemple. au format XML ou JSON. L'obtention de réponses dans un autre format peut impliquer la définition d'un en-tête ACCEPT approprié à la requête HTTP, l'ajout de paramètres supplémentaires à la requête ou la modification du chemin.

  • Consultez la documentation de l'API Web pour la webapp/site Web pour voir si cela est mentionné.
  • Ou vérifiez le code source de la webapp ... si vous l'avez.
  • Ou s'il s'agit de votre code, pensez à le changer pour prendre en charge XML, JSON ou même ad hoc réponses textuelles. (Si vous prenez cette voie, ce serait une bonne idée de lire sur les types de médias et définir celui qui convient dans l'en-tête « Content-type » de vos réponses.)
+0

+1 pour suggérer l'utilisation d'un format plus approprié –