在 HtmlAgilityPack 中规范化空间



这是html代码片段。如何获取规范化空间文本?

搜索相同的片段,但使用 Xpath//*[normalize-space()='Text1 Text2']

<div>
<div>
<a></a>
<a></a>
<div><a><span></span>Text2</a></div>
</div>
<div>Text2</div>
</div>

用:

var htmlNodes = htmlDoc.DocumentNode.SelectNodes("*");
foreach (var node in htmlNodes)
{
text += node.InnerText;
}

我得到这个字符串:

"rn                        rn                        rn                        rn                        rn                        Text1rn                    Text2"

我可以得到一个普通的文本吗?

"Text1 Text2"

您可以改用InnerText属性:

var texts = document.DocumentNode.Descendants("div").Select(n => n.InnerText);

如果需要,可以将它们组合在一起:

var combined = string.Join(" ", texts);

过滤掉空值:

.Select(n => n.InnerText.Replace("rn", "")).Where(s => !string.IsNullOrEmpty(s));

如果您已经在所需的节点上,并且不介意将所有空格变成单个空格字符:

var htmlNodes = htmlDoc.DocumentNode.InnerText;
var normalized = Regex.Replace(htmlNodes.Trim(), @"s+", " ");

叶节点搜索,这将使元素内非空格中的空格保持不变(例如,如果您有<div><a><span></span>this needs space</a></div>(:

var leafNodes = htmlDoc.DocumentNode.Descendants()
.Where(x => !x.ChildNodes.Any());
var trimmedInnerText = leafNodes.Select(x => x.InnerText.Trim())
.Where(x => !string.IsNullOrEmpty(x));
var outputString = string.Join(" ", trimmedInnerText);

最新更新