Regex a HtmlAgilityPack C #

c# html-agility-pack regex

Pregunta

Quiero saber cómo convertir mi código que usa expresiones regulares para coincidir con las cadenas del sitio web en otra que use la biblioteca HtmlAgilityPack.

Código de ejemplo:

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

Mi código actual es el siguiente:

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;

Y funciona.

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

Pero solo agrega A.1.

¿Como lo puedo hacer?

Respuesta aceptada

Su expresión regular "title=\"(.+?)\">" Coincide y captura cualquier atributo de título , en cualquier etiqueta dentro del documento HTML.

Por lo tanto, use otro código con //*[@title] XPath que obtenga cualquier nodo de elemento ( * ) que contenga un atributo de título , y luego itere a través de los nodos de atributo y una vez que su nombre sea title , agregue el valor a la 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();


Related

Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow