【问题标题】:Normalize Space in HtmlAgilityPack规范化 HtmlAgilityPack 中的空间
【发布时间】:2018-09-14 17:03:17
【问题描述】:

这里是 html sn-p。如何获得规范化空间文本?

要搜索相同的片段,但使用 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;
}

我得到这个字符串:

"\r\n                        \r\n                        \r\n                        \r\n                        \r\n                        Text1\r\n                    Text2"

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

"Text1 Text2"

【问题讨论】:

    标签: c# xpath html-agility-pack


    【解决方案1】:

    您可以改用InnerText 属性:

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

    如果你愿意,可以将它们组合起来:

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

    过滤掉空值:

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

    【讨论】:

    • 第一个div不一定有,怎么指定?
    • 需要获取所有DocumentNode的文本
    • @Vipz 然后使用 document.DocumentNode.InnerText
    • 我所知道的是,在我这样做之前,它并没有解决我的问题。我仍然在文本中看到它。 "\r\n "
    【解决方案2】:

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

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

    叶节点搜索,这将保持元素内非空白中的空白不变(例如,如果您有 &lt;div&gt;&lt;a&gt;&lt;span&gt;&lt;/span&gt;this needs space&lt;/a&gt;&lt;/div&gt;):

    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);
    

    【讨论】:

    • Text1\r\n \r\n Text2
    • 啊,.SelectNodes("*") 最终只是选择了最外层的元素,忘记了 HAP 会这样工作。为了给你一个完整的答案,我需要更多的上下文。考虑使用正则表达式将任何/所有空格替换为单个空格,或者当前对 html 文档进行深度优先搜索(现在将在编辑中执行这些操作)
    猜你喜欢
    • 1970-01-01
    • 2020-11-06
    • 1970-01-01
    • 2016-02-27
    • 1970-01-01
    • 1970-01-01
    • 2015-11-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多