HtmlAgilityPack 设置节点 InnerText

问题描述 投票:0回答:3

我想用其他文本替换 HTML 标签的内部文本。 我正在使用 HtmlAgilityPack
我使用此代码来提取所有文本

HtmlDocument doc = new HtmlDocument();
doc.Load("some path")

foreach (HtmlNode node in doc.DocumentNode.SelectNodes("//text()[normalize-space(.) != '']")) {
    // How to replace node.InnerText with some text ?
}

但是 InnerText 是只读的。如何用另一个文本替换文本并将它们保存到文件中?

c# parsing html-parsing html-agility-pack
3个回答
24
投票

尝试下面的代码。它选择所有没有子节点的节点并过滤掉脚本节点。也许您需要添加一些额外的过滤。除了 XPath 表达式之外,该表达式还查找叶节点并过滤出

<script>
标签的文本内容。

var nodes = doc.DocumentNode.SelectNodes("//body//text()[(normalize-space(.) != '') and not(parent::script) and not(*)]");
foreach (HtmlNode htmlNode in nodes)
{
    htmlNode.ParentNode.ReplaceChild(HtmlTextNode.CreateNode(htmlNode.InnerText + "_translated"), htmlNode);
}

16
投票

奇怪,但我发现 InnerHtml 不是只读的。当我尝试这样设置时

aElement.InnerHtml = "sometext";

InnerText
的值也变为
"sometext"


7
投票

HtmlTextNode
类有一个
Text
属性*,非常适合此目的。

这是一个例子:

var textNodes = doc.DocumentNode.SelectNodes("//body//text()").Cast<HtmlTextNode>();
foreach (var node in textNodes)
{
    node.Text = node.Text.Replace("foo", "bar");
}

如果我们有一个

HtmlNode
想要更改其 direct 文本,我们可以执行如下操作:

HtmlNode node = //...
var textNode = (HtmlTextNode)node.SelectSingleNode("text()");
textNode.Text = "new text";

或者如果有多个,我们可以使用

node.SelectNodes("text()")


* 不要与只读

InnerText
属性混淆。

© www.soinside.com 2019 - 2024. All rights reserved.