Попробуйте код ниже. Он выбирает все узлы без потомков и отфильтровывает узлы сценария. Может быть, вам нужно добавить дополнительную фильтрацию. В дополнение к вашему выражению 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);
}