使用 HTML Agility 去除 HTML 标签但留下内部文本?

Posted

技术标签:

【中文标题】使用 HTML Agility 去除 HTML 标签但留下内部文本?【英文标题】:Strip HTML tag but leave inner text using HTML Agility? 【发布时间】:2011-04-25 15:39:44 【问题描述】:

我正在尝试去除一些 html 标签。我有一个项目,该人保存了一些搜索。问题是关键字已突出显示。例如。

<p>Here is some <span class='highlite'>awesome</span> example.</p>

Html Agility 将其变成 3 个节点。一个文本节点、跨度和文本。我想以此创建一个标签。所以它看起来像

<p>Here is some awesome example.</p>

我尝试使用 css class highlite 获取所有标签,然后

 //Stip all retarded hilite tags
 var hiliteTags = from tags in doc.DocumentNode.SelectNodes("//span[@class='hilite']")
                  select tags;

 foreach (var tag in hiliteTags)
 
      tag.ParentNode.RemoveChild(tag, true);
 

但这会导致文本节点、文本节点、文本节点。我想要一个文本节点。然后我尝试使用

Node.InnerText += someVariable;

但是 InnerText,尽管文档说的是只读的。

关于如何做到这一点的任何想法?

其次,当我问的时候,有没有办法摆脱只包含文本的节点,它是一个 \r\n。我对此根本不感兴趣,它只会妨碍解析并使解析变得尴尬。我也希望能够删除这些。例如

<tr>
    <td>Foo</td>
    <td>Bar</td>
</tr>

使用 Html Agility 变成

Node (tr)
Node (\r\n)
Node (td- Foo)
Node (\r\n)
Node (td - Bar)
Node (\r\n)
Node (tr)

我正在努力选择这些节点。我尝试过使用 Linq,也尝试过使用 XPath。我似乎无法删除它们。

【问题讨论】:

【参考方案1】:

如果你只取 p 标签的 InnerText,并创建一个单独的文档树来保存它。

var root = HtmlNode.CreateNode("<root></root>");
foreach (var node in doc.DocumentNode.SelectNodes("/p"))

    var newNode = HtmlNode.CreateNode(string.Format("<p>0</p>", node.InnerText));
    root.AppendChild(newNode);

这有帮助吗?

【讨论】:

以上是关于使用 HTML Agility 去除 HTML 标签但留下内部文本?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 HTML Agility Pack 修复格式错误的 HTML?

使用 Html Agility Pack 从 HTML BODY 节点中提取内部文本

使用 html agility xpath 查找 webdriver 元素

如何使用 Html Agility Pack 使请求超时

Html Agility Pack:查找评论节点

csharp Html Agility Pack #CSharp #HtmlParsing