Regex to HtmlAgilityPack C #

c# html-agility-pack regex

Question

Je veux savoir comment convertir mon code qui utilise regex pour faire correspondre les chaînes de site Web dans d'autres qui utilise la bibliothèque HtmlAgilityPack.

Exemple de code:

<div class="element"><div class="title"><a href="127.0.0.1" title="A.1">A.1</a></div></div>
<div class="element"><div class="title"><a href="127.0.0.1" title="A.2">A.2</a></div></div>

Mon code actuel est le suivant:

List<string> Cap = new List<string>();
WebClient web = new WebClient();
string url = web.DownloadString("127.0.0.1");
MatchCollection cap = Regex.Matches(url, "title=\"(.+?)\">", RegexOptions.Singleline);
foreach (Match m in cap)
{
     Cap.Add(m.Groups[1].Value.ToString());
}
lst_Cap.ItemsSource = Cap;

Et il fonctionne.

J'ai essayé avec HtmlAgilityPack:

HtmlDocument Web = web.Load("127.0.0.1"); // 127.0.0.1 for example
List<string> Cap = new List<string>();
foreach (HtmlNode node in Web.DocumentNode.SelectNodes("//*[@id=\"content\"]/div/div[3]/div[2]/div[1]/a"))
{
    Cap.Add(node.InnerHtml);
}

Mais il ajoute seulement A.1.

Comment puis-je faire?

Réponse acceptée

Votre expression rationnelle "title=\"(.+?)\">" Correspond et capture tout attribut title , dans toutes les balises du document HTML.

Donc, utilisez un autre code avec //*[@title] XPath qui récupère tous les nœuds d'élément ( * ) contenant un attribut title , puis parcourez simplement les nœuds d'attribut et, une fois son nom title , ajoutez la valeur à la liste:

var nodes = Web.DocumentNode.SelectNodes("//*[@title]");
if (nodes != null)
{
   foreach (var node in nodes)
   {
       foreach (var attribute in node.Attributes)
           if (attribute.Name == "title")
               Cap.Add(attribute.Value);
   }
}

Ou en utilisant LINQ:

var nodes = Web.DocumentNode.SelectNodes("//*[@title]");
var res = nodes.Where(p => p.HasAttributes)
                 .Select(m => m.GetAttributeValue("title", string.Empty))
                 .Where(l => !string.IsNullOrEmpty(l))
                 .ToList();



Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi