使用 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..."
单词action
和Typical
已经拼在一起,没有任何空格(因为它们之间只有html 标签)。这阻碍了我对文本内容进行标记化的努力,因为 action.Typical
被视为单个词而不是两个词。
当然,我可以只运行搜索和替换(可能使用正则表达式),例如 (\S)\.(\S)
并将其替换为 $1。 $2
但那样的话需要像 www.somecompany.com
这样的东西并将其拆分为 www
、somecompany
和 com
并且我可能想保留它(或者失败时 www
和 com
无论如何都不太可能非常有用他们自己)。我可以排除带有多个点的单词,但网址可能显示为 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/