HTML Agility Pack链接更正

时间:2012-07-31 19:59:07

标签: c# syntax html-agility-pack

我正在做一个小项目,我遇到了一些问题,希望你能帮助我。

我有一些基本的几行加载给定的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敏捷性,我的想法并没有直截了当。

谢谢!

1 个答案:

答案 0 :(得分:3)

所以你想在某些节点中搜索包含相对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");
}