HtmlAgilityPack设置节点InnerText

时间:2011-11-25 21:34:51

标签: 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 ?
}

但是InnerText是readonly。如何用其他文本替换文本并将其保存到文件?

3 个答案:

答案 0 :(得分: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);
}

答案 1 :(得分:15)

奇怪,但我发现InnerHtml不是只读的。当我试图像那样设置它时

aElement.InnerHtml = "sometext";

InnerText的值也更改为"sometext"

答案 2 :(得分:1)

import java.util.Scanner; import edhesive.testing.Math; public class U2_L8_Activity_One{ public static void main(String[] args){ System.out.println("Please enter a integer"); Scanner scan = new Scanner(System.in); int n = scan.nextInt(); double ran = Math.random(); int min = 1; int answer = (int) (Math.random() * n) + min; int answer1 = (int) (Math.random() * n) + min; int answer2 = (int) (Math.random() * n) + min; int answer3 = (int) (Math.random() * n) + min; int answer4 = (int) (Math.random() * n) + min; int answer5 = (int) (Math.random() * n) + min; int answer6 = (int) (Math.random() * n) + min; int answer7 = (int) (Math.random() * n) + min; int answer8 = (int) (Math.random() * n) + min; int answer9 = (int) (Math.random() * n) + min; System.out.println(answer); System.out.println(answer1); System.out.println(answer2); System.out.println(answer3); System.out.println(answer4); System.out.println(answer5); System.out.println(answer6); System.out.println(answer7); System.out.println(answer8); System.out.println(answer9); } } 类具有HtmlTextNode属性 * ,可以完美地用于此目的。

这是一个例子:

Text

如果我们有一个var textNodes = doc.DocumentNode.SelectNodes("//body/text()").Cast<HtmlTextNode>(); foreach (var node in textNodes) { node.Text = node.Text.Replace("foo", "bar"); } 要更改其 direct 文本,则可以执行以下操作:

HtmlNode

或者我们可以使用HtmlNode node = //... var textNode = (HtmlTextNode)node.SelectSingleNode("text()"); textNode.Text = "new text"; 来防止多个。


* 不要与只读node.SelectNodes("text()")属性混淆。