Regex to HtmlAgilityPack C #

c# html-agility-pack regex

Domanda

Voglio sapere come convertire il mio codice che utilizza regex per abbinare le stringhe del sito Web in un altro che utilizza la libreria HtmlAgilityPack.

Codice di esempio:

<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>

Il mio codice corrente è il seguente:

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;

E funziona.

Ho provato con 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);
}

Ma aggiunge solo A.1.

Come posso fare?

Risposta accettata

La tua regex "title=\"(.+?)\">" Corrisponde e cattura qualsiasi attributo titolo , in qualsiasi tag all'interno del documento HTML.

Quindi, usa un altro codice con //*[@title] XPath che ottiene qualsiasi nodo elemento ( * ) che contiene un attributo title , e quindi esegue semplicemente un'iterazione attraverso i nodi dell'attributo e una volta che il suo nome è title , aggiungi il valore alla lista:

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);
   }
}

O usando 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();


Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché