HTML Agility Pack - 删除图像父级的超链接

时间:2018-03-12 06:23:01

标签: c# html-agility-pack

为了使代码易于解释,我有以下代码,其中我使用HTML并使用HAP查找所有图像src并将其替换为数字。

HtmlDocument document = new HtmlDocument();
document.LoadHtml(htmlString);                
int Counter = 0;
document.DocumentNode.Descendants("img")
         .Where(e =>
          {
           string src = e.GetAttributeValue("src", null) ?? "";
           return !string.IsNullOrEmpty(src);
          })
          .ToList()
          .ForEach(x =>
            {
            string currentSrcValue = x.GetAttributeValue("src", null);                                
            localImgPath = "<Somepath>IMG_" + Counter.ToString() + ".jpg";                      
            Counter++;
            });
           x.SetAttributeValue("src", localImgPath);
          });

INPUT <img src="https://imagepath"/>

输出<img src="<somepath>IMG_1.jpg"/>

现在这完美无缺

但我面临的问题是,有些图片在hyperlink内,例如

<a href="https://imagepath"><img src="https://imagepath"/></a>

在处理图像时我想知道图像是否在超链接内并删除超链接,如下所示

INPUT <a href="https://imagepath"><img src="https://imagepath"/></a>

输出<img src="<somepath>IMG_1.jpg"/>

需要注意的是,我不想删除HTML中的所有超链接,只删除作为图像父级的超链接。

是否可以使用HAP?

1 个答案:

答案 0 :(得分:0)

您应该可以使用以下代码完成此操作。您可能希望获取所有图像元素并检查父级。如果父级是链接,则应将其添加到要删除的节点列表中。

var images = document.DocumentNode.Descendants("img").ToList();

var nodesToRemove = new List<HtmlNode>();

foreach (var image in images)
{
    var parent = image.ParentNode;
    if (parent.Name.Equals("a"))
    {
        nodesToRemove.Add(parent);
    }
}

然后通过获取父节点并调用RemoveChild方法来删除这些节点。这将取出你想删除的节点,加上一个bool,说明是否要保留孙子(在这种情况下,你想要保留图像元素,这就是你想要的。)

foreach (var node in nodesToRemove)
{
    node.ParentNode.RemoveChild(node, true);
}