HtmlAgilityPack设置节点InnerText

Sha*_*hin 27 c# parsing html-parsing html-agility-pack

我想用另一个文本替换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 ?
}
Run Code Online (Sandbox Code Playgroud)

但是InnerText是只读的.如何用其他文本替换文本并将其保存到文件?

Yur*_*kiy 20

请尝试以下代码.它选择没有子节点的所有节点并过滤掉脚本节点.也许你需要添加一些额外的过滤.除了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);
}
Run Code Online (Sandbox Code Playgroud)


len*_*ena 15

奇怪,但我发现InnerHtml不是只读的.而当我试图这样设置它

aElement.InnerHtml = "sometext";
Run Code Online (Sandbox Code Playgroud)

价值InnerText也改为"sometext"

  • InnerHtml不是readonly.InnerText是.关于InnerText不是只读的文档似乎是错误的. (4认同)
  • 但你也有机会改变 html 标签 (2认同)

Ahm*_*eed 6

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

这是一个例子:

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

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

HtmlNode node = //...
var textNode = (HtmlTextNode)node.SelectSingleNode("text()");
textNode.Text = "new text";
Run Code Online (Sandbox Code Playgroud)

或者我们可以node.SelectNodes("text()")在它有多个的情况下使用。


* 不要与只读属性混淆InnerText