1

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

我得到了这些基本的几行代码,它们加载了给定的 url 并取出了一些标签:

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

收到集合后,我需要运行一个 foreach 循环,该循环可以获取所有hrefsrc链接并使它们有效,因为当我下载源时,链接看起来像/folder/folder/image.jpg 我想在每个链接之前添加http://www.site.com 。

我已经用 Regex 构建了这个项目并且没有问题,但是 HTML 敏捷性并没有让我的想法直截了当。

谢谢!

4

1 回答 1

4

因此,您想在某些节点中搜索包含相对 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");
}
于 2012-07-31T20:47:55.707 回答