2009-10-23 4 views
0

J'ai une application console qui analyse des documents HTML via la méthode WebRequest (http). Le problème est vraiment d'extraire des données du code html qui est retourné.C# extraction de certaines parties d'une chaîne

Ci-dessous est un fragment du html Je suis intéressé par:

<span class="header">Number of People:</span> 
<span class="peopleCount">1001</span> <!-- this is the line we are interested in! --> 
<span class="footer">As of June 2009.</span> 

On suppose que le code html ci-dessus est contenu dans une chaîne appelée « responseHTML ». Je voudrais simplement extraire la valeur "People Count" (deuxième ligne).

J'ai cherché pile sur les flux et trouvé un code qui pourrait fonctionner:

How do I extract text that lies between parentheses (round brackets)?

Mais quand je mets en œuvre, il ne fonctionne pas - je ne pense pas qu'il aime la façon dont je ont placé des balises HTML dans le regex:

 string responseHtml; // this is already filled with html code above ^^ 
     string insideBrackets = null; 


     Regex regex = new Regex("\\<span class=\"peopleCount\">?<TextInsideBrackets>\\w+\\</span>"); 

     Match match = regex.Match(responseHtml); 
     if (match.Success) 
     { 
      insideBrackets = match.Groups["TextInsideBrackets"].Value; 
      Console.WriteLine(insideBrackets); 
     } 

ci-dessus ne fonctionne pas juste, est-il quelque chose à voir avec les supports de portée html? Tout ce que je veux, c'est la valeur du texte entre les balises pour cette durée spécifique.

Merci d'avance!

Répondre

3

Essayez celui-ci:

Regex regex = new Regex("class=\\\"peopleCount\\\"\\>(?<data>[^\\<]*)", 
RegexOptions.CultureInvariant 
| RegexOptions.Compiled 
); 

Il devrait être un peu plus rapide, comme vous dites en gros les données que vous cherchez commence après peopleCount "> et se termine à la première <

(j'ai changé le nom du groupe aux données)

Cheers, Florian

+0

Fantastique !! ça a marché! Je vous remercie! – Dal

+0

Heureux que ça a marché! Juste une note, vous pouvez (et devriez) réutiliser l'instance regex si vous voulez le faire plusieurs fois, même à travers plusieurs threads. Regex sont threadsafe et cette perticular obtient un traitement spécial en raison de l'argument RegexOptions.Compiled. À la votre –

3

?<TextInsideBrackets> est incorrect

Vous avez besoin:

(?<TextInsideBrackets>...) 
+0

Merci pour l'entrée! – Dal

1

Je suppose que vous voulez faire une capture du nom.

Vous devez utiliser

Regex regex = new Regex("\\<span class=\"peopleCount\">(?<TextInsideBrackets>\\w+)\\</span>");

et non

Regex regex = new Regex("\\<span class=\"peopleCount\">?<TextInsideBrackets>\\w+\\</span>");

+0

Merci pour l'aide, je vois qu'il me manquait les parenthèses rondes! – Dal

Questions connexes