c# - 保留(或恢复)TextContent 中的空格

标签 c# anglesharp

使用 AngleSharp 处理一些 HTML 并提取元素的文本内容以供以后挖掘,我遇到了 AngleSharp 去除 HTML 标签的方式的问题。例如,我有一段类似这样的 HTML(减去换行符和制表符):

<div id="someID">
    blah, blah, blah, blah
    blah, blah, 
    <ul>
        <li><i>action.</i></li>
        <li><i>Typical, blah, blah, blah</li>
    </ul>
    blah, blah, blah
</div>

这里的问题是,当我得到 TextContent 时:

var content = someDiv.TextContext;

结果是这样的:

"...blah, blah, action.Typical blah, blah..."

单词actionTypical 已经拼在一起,没有任何空格(因为它们之间只有html 标签)。这阻碍了我对文本内容进行标记化的努力,因为 action.Typical 被视为单个词而不是两个词。

当然,我可以只运行搜索和替换(可能使用正则表达式),例如 (\S)\.(\S) 并将其替换为 $1。 $2 但那样的话需要像 www.somecompany.com 这样的东西并将其拆分为 wwwsomecompany com 并且我可能想保留它(或者失败时 wwwcom 无论如何都不太可能非常有用他们自己)。我可以排除带有多个点的单词,但网址可能显示为 somecompany.com(没有 www),或者您可能会遇到像 这样的电子邮件地址somebody@somecompany.com.

有没有可靠的方法解决这个问题?去掉标签后至少保留一个空格?

最佳答案

所以看起来解决这个问题的最好方法是递归 ChildNodes (不是 Children 会丢失文本节点)根元素,然后再次将它们连接在一起。所以,给定:

var rootElem = myDoc.GetElementById("someId");

我可以创建这样的函数:

IEnumerable<string> ExtractChildNodes(INode node)
{
    if (node.HasChildNodes)
    {
        foreach (var c in node.ChildNodes)
        {
            foreach (var r in ExtractChildNodes(c))
            {
                yield return r;
            }
        }
    }
    else
    {
        yield return node.TextContent;
    }
}

这将测试一个节点是否有子节点,以及它是否向下钻取到最低的叶节点并从那里返回文本。然后我可以这样做:

var textContentWithSpacesBetweenNodes = string.Join(" ", ExtractChildNodes(rootElem));

应该给我:

"...blah, blah, action. Typical blah, blah..."

action之间的空格和 Typical .

这似乎不仅可以应对 <p>some.</p><p>words</p> 这样的情况还有像 some</br>words 这样的自闭标签甚至 some<br>words使用正则表达式或类似的东西来处理这将是一个巨大的痛苦。

关于c# - 保留(或恢复)TextContent 中的空格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34513559/

相关文章:

c# - 当我的代码在调试器中抛出异常时,为什么 Visual Studio 2010 不向我显示弹出窗口和抛出异常的位置?

c# - 使用 C# 进行异步或批处理

c# - 数据为空。试图获得 8AM 和 CurrentTime 的 TIMESTAMPDIFF

c# - 如何使用 AngleSharp & LINQ 从网站中提取数据?

c# - AngleSharp OpenAsync 返回空体

c# - 如何在 AngleSharp 中解析来自匿名 block 的文本?

c# - 如何在 C# 属性声明中使用 Fluent 风格的语法糖

c# - 点击事件中的 ajax 请求后重定向

c# - 如何以编程方式构建 AngleSharp CSS(或 HTML)DOM

c# - 如何在没有 AsyncEx 库的情况下调用 anglesharp 异步方法?