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

HTML Agility Pack - Removing hyperlinks parent to an image

为了使代码易于解释,我有以下代码,其中我使用 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);
          });

输入 : <img src="https://imagepath"/>

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

现在这完美地工作了

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

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

在处理图片的过程中,我想知道图片是否在超链接内,然后删除超链接,如下所示

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

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

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

是否可以使用 HAP?

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

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 方法来删​​除这些节点。这将采用您想要删除的节点,加上一个布尔值,说明是否保留孙子(在这种情况下,您希望保留图像元素)。

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