【问题标题】:How do I insert an HTML tag outside the selected tag?如何在所选标签之外插入 HTML 标签?
【发布时间】:2014-10-18 17:28:23
【问题描述】:

我目前正在研究如何在所选标签之外插入 HTML 标签。

我在 HtmlDocument 上加载的是一个包含“一些”HTML 标记的文本文件。它不是包含标签的 HTML 文档,而是带有“一些”HTML 标签的文本文件。

这是文本文件的示例内容

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas vel risus id velit iaculis elementum egestas vel purus. Vestibulum ante ipsum primis in <a href="http://www.domain.com">this domain</a> faucibus orci luctus et ultrices posuere cubilia Curae; In lorem enim, dignissim id congue at, malesuada vitae sem. Phasellus et nibh venenatis, vulputate elit ut, consectetur tellus. 

Sed placerat ex et dolor lobortis convallis. Nulla tincidunt elementum elementum. Integer lacinia elementum orci, ac pretium lacus hendrerit eu. Donec vitae lorem leo. Curabitur placerat sagittis nisi eu posuere. Vestibulum eget felis nisi. Nunc vitae enim iaculis, <a href="http://www.domain.com">this domain</a> maximus justo ullamcorper, imperdiet felis. Vestibulum vestibulum sapien id diam dapibus pharetra. Pellentesque varius purus justo, a vehicula lectus semper at.

那里有两个 A 标签,我的 xpath 就像“//a”一样简单。我的目标是用 B、U 或 I 来装饰 A 标签。输出会像

<b><u><a href="http://www.domain.com">this domain</a></u></b>

我希望 HtmlNode.InsertBefore 会有所帮助,但发生的事情是这样的

<a href="http://www.domain.com">this domain<b></b><u></u></a>

如果使用 HtmlNode.InsertAfter,它看起来像这样

<a href="http://www.domain.com"><b></b><u></u>this domain</a>

InsertBefore和InsertAftere都需要一个引用节点,没有引用节点所以我设置为null

这是示例代码

HtmlDocument doc = new HtmlDocument();
doc.LoadHtml(this.document);

HtmlNodeCollection nodcoll = doc.DocumentNode.SelectNodes("//a");
if (nodcoll != null)
{
    foreach (HtmlNode nod in nodcoll)
    {
        // nod.InsertAfter(HtmlNode.CreateNode(newhtml), null);
        // nod.InsertBefore(HtmlNode.CreateNode(newhtml), null);
    }           
}

更新 我忘了提到这是 SEO 对格式化 A 标签的偏好。如果格式在 A 标签内,那就容易多了

【问题讨论】:

标签: c# html html-agility-pack


【解决方案1】:

选项 A

实现此目的的一种方法是像这样替换InnerHtml

var nodeList = doc.DocumentNode.SelectNodes("//a");
if (nodeList != null && nodeList.Count > 0)
{
    foreach (var node in nodeList)
    {
        node.InnerHtml = "<b><u>" + node.InnerHtml + "</b></u>";
        // can also be written as:
        // node.InnerHtml = node.InnerHtml.Replace(node.InnerHtml, "<b><u>" + node.InnerHtml + "</b></u>");
    }
}

以上会产生:

<a href="http://www.domain.com"><b><u>this domain</u></b></a>

选项 B

替换节点的另一种方法是:

var nodeList = doc.DocumentNode.SelectNodes("//a");
if (nodeList != null && nodeList.Count > 0)
{
    foreach (var node in nodeList)
    {
        // Reads the outer or you lose the link element
        var newNodeStr = "<b><u>" + node.OuterHtml + "</b></u>";
        // Replace the old node with our newly created one
        var newNode = HtmlNode.CreateNode(newNodeStr);
        node.ParentNode.ReplaceChild(newNode, node);
    }
}

上面会产生:

<b><u><a href="http://www.domain.com">this domain</a></u></b>

【讨论】:

  • 是的,但请记住,我们的目标是将这些格式设置在 A 标记之外。这是我们 SEO 的偏好 :(
  • @jaysonragasa 请参阅选项 B.
猜你喜欢
  • 1970-01-01
  • 2021-09-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多