Corrección de enlace HTML Agility Pack

c# html-agility-pack syntax

Pregunta

Estoy trabajando en un pequeño proyecto y tengo un pequeño problema, espero que puedas ayudarme.

Conseguí estas pocas líneas básicas que cargan una url dada y saca algunas etiquetas:

var webGet2 = new HtmlWeb();
HtmlAgilityPack.HtmlDocument doc = webGet2.Load(pattern);
var htmlMatches = doc.DocumentNode.SelectNodes("//li[@class=''] | //li[@class='f']");

Después de recibir la colección, necesito ejecutar un bucle foreach que puede tomar todos los enlaces href y src y hacerlos válidos, porque cuando estoy descargando la fuente, el enlace se parece a /folder/folder/image.jpg Quiero agregar http://www.site.com antes de cada enlace.

Construí este proyecto con Regex y no tuve ningún problema al hacerlo, pero con la agilidad de HTML no se me está poniendo claro.

¡Gracias!

Respuesta aceptada

Entonces, ¿desea buscar en algunos nodos ciertos atributos que contienen urls relativas y cambiarlos a urls absolutos? Podrías hacer esto:

static void AdjustAttributes(HtmlNode root, string baseUrl, string attrName)
{
    var query =
        from node in root.Descendants()
        let attr = node.Attributes[attrName]
        where attr != null
        select attr;
    foreach (var attr in query)
    {
        var url = GetAbsoluteUrlString(baseUrl, attr.Value);
        attr.Value = url;
    }
}

static string GetAbsoluteUrlString(string baseUrl, string url)
{
    var uri = new Uri(url, UriKind.RelativeOrAbsolute);
    if (!uri.IsAbsoluteUri)
        uri = new Uri(new Uri(baseUrl), uri);
    return uri.ToString();
}
var web = new HtmlWeb();
var doc = web.Load(pattern);
var selectedNodes = doc.DocumentNode.SelectNodes("//li[@class=''] | //li[@class='f']");
foreach (var node in selectedNodes)
{
    AdjustAttributes(node, url, "href");
    AdjustAttributes(node, url, "src");
}


Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué