Question

À l'aide d'expressions régulières, quel est le moyen le plus simple de récupérer le code HTML d'un site Web et de trouver la valeur à l'intérieur de cette balise (ou la valeur de n'importe quel attribut d'ailleurs) :

<html>
  <head>
  [snip]
  <meta name="generator" value="thevalue i'm looking for" />
  [snip]
Était-ce utile?

La solution

Cela dépend du degré de sophistication d'une requête HTTP que vous devez créer (authentification, etc.).Voici une méthode simple que j'ai vue utilisée dans le passé.

StringBuilder html = new StringBuilder();
java.net.URL url = new URL("http://www.google.com/");
BufferedReader input = null;
try {
    input new BufferedReader(
        new InputStreamReader(url.openStream()));

    String htmlLine;
    while ((htmlLine=input.readLine())!=null) {
        html.appendLine(htmlLine);
    }
}
finally {
    input.close();
}

Pattern exp = Pattern.compile(
    "<meta name=\"generator\" value=\"([^\"]*)\" />");
Matcher matcher = exp.matcher(html.toString());
if(matcher.find())
{
    System.out.println("Generator: "+matcher.group(1));
}

Il y a probablement beaucoup de fautes de frappe ici lors de la compilation.(j'espère que ce n'était pas un devoir)

Autres conseils

Il est étonnant de voir que personne, lorsqu'il aborde le problème de l'utilisation de RegEx avec HTML, n'est souvent confronté au problème du HTML. PAS étant bien formé, rendant ainsi de nombreux analyseurs HTML complètement inutiles.

Si vous développez des outils pour analyser des pages Web et qu'il est vrai qu'elles ne sont pas du HTML bien formé, la déclaration "Regex ne doit jamais être utilisée pour analyser le HTML" et "utiliser un analyseur HTML" est tout simplement complètement fausse.Les faits sont que dans le monde réel, les gens créent du HTML comme bon leur semble - et pas nécessairement adapté aux analyseurs.

ExEx régulière est un moyen tout à fait valable de rechercher des éléments dans du texte, donc en HTML.S'il existe un autre moyen raisonnable de résoudre les problèmes rencontrés par l'affiche originale, publiez-les au lieu de faire référence à une déclaration « utiliser un analyseur » ou « RTFM ».

Vous devriez utiliser la requête XPath.

C'est aussi simple que d'obtenir la valeur de /html/head/meta[@name=generator]/@value.

Un bon tuto : Analyser un document XML avec XPath

Vous souhaiterez peut-être consulter la documentation du package org.apache.commons.HttpClient d'Apache et des packages associés. ici.Envoyer une requête HTTP depuis une application Java est assez simple à faire.Parcourir la documentation devrait vous mettre dans la bonne direction.

À proprement parler, vous ne pouvez pas vraiment être sûr d'avoir obtenu la bonne valeur, car la balise méta peut être commentée, ou la balise méta peut être en majuscule, etc.Cela dépend de votre certitude que le HTML peut être considéré comme « sympa ».

Ça dépend.

Si vous extrayez des informations d'un ou plusieurs sites dont le format HTML est garanti et que vous savez que le <meta> ne sera pas obscurci d'une manière ou d'une autre, lisez la section <head> ligne par ligne et appliquez un regex est une bonne approche.

D'un autre côté, si le code HTML peut être mutilé ou « délicat », vous devez alors utiliser un analyseur HTML approprié, éventuellement permissif comme HTMLTidy.Méfiez-vous de l'utilisation d'un analyseur HTML ou XML strict sur des éléments provenant de sites Web aléatoires.De nombreux soi-disant HTML que vous y découvrez sont en réalité mal formés.

Je n'ai pas essayé cela, mais le cadre de base ne serait-il pas

  1. Ouvrir un java.net.HttpURLConnection
  2. Obtenez un flux d'entrée en utilisant getInputStream
  3. Utilisez l'expression régulière dans la réponse de Mike pour analyser le bit souhaité
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top