Коррекция ссылок в HTML Agility Pack

c# html-agility-pack syntax

Вопрос

Я работаю над небольшим проектом, и у меня есть небольшая проблема, надеюсь, вы могли бы мне помочь.

Я получил несколько базовых строк, которые загружают заданный URL-адрес и вынимают теги:

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

После получения коллекции мне нужно запустить цикл foreach, который может взять все ссылки href и src и сделать их действительными, потому что когда я загружаю источник, ссылка выглядит как /folder/folder/image.jpg Я хочу добавить http://www.site.com перед каждой ссылкой.

Я создал этот проект с помощью Regex и не испытывал никаких проблем с этим, но с маневренностью HTML его не стало прямо с моей точки зрения.

Спасибо!

Принятый ответ

Итак, вы хотите найти некоторые узлы для определенных атрибутов, содержащих относительные URL-адреса и изменить их на абсолютные URL-адреса? Вы можете сделать это:

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


Related

Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow