use*_*325 2 html c# parsing text anglesharp
我正在尝试使用AngleSharp库解析一些HTML,这个库到目前为止一直很棒.我现在偶然发现了一个我要解析以下HTML的场景:
<a name="someLink" href="#someLink">Link 1</a>
Some text that happens to be in between elements...
<b>Some stuff in bold</b>
Some more text
<br>
Run Code Online (Sandbox Code Playgroud)
当然,这段HTML包含了父元素等,但是这段HTML的解析元素的结果列表是:
有效地跳过元素之间的文本.我如何获得此文本?我认为AngleSharp会为这些部分生成TextNodes吗?
请注意,获取父级的完整TextContent不是我想要做的,因为我实际上仍然需要元素的结构来知道什么是什么.
这种行为实际上是DOM规范所期望的.你可能没有意识到这一点,但你已经回答了自己的问题:)
这就是你看起来不太对劲:Element!= Node.您询问了元素,但是您正在寻找节点.
像<a>etc 这样的标签最终成为元素,而文本节点则是...井......节点,而不是元素.而且你要求API为你提供元素.换句话说,您告诉API您不希望返回文本节点.
我们来做一个简单的演示.
var parser = new HtmlParser();
var doc = parser.Parse(@"<div id=""content"">
<a name=""someLink"" href=""#someLink"">Link 1</a>
Some text that happens to be in between elements...
<b>Some stuff in bold</b>
Some more text
<br>
</div>");
var content = doc.GetElementById("content");
Run Code Online (Sandbox Code Playgroud)
现在,这基本上就是你一直在做的事情:
foreach (var element in content.Children)
Console.WriteLine(element.GetType().Name);
Run Code Online (Sandbox Code Playgroud)
这输出:
HtmlAnchorElement
HtmlBoldElement
HtmlBreakRowElement
这就是你想要的:
foreach (var element in content.ChildNodes)
Console.WriteLine(element.GetType().Name);
Run Code Online (Sandbox Code Playgroud)
现在的输出是:
TextNode
HtmlAnchorElement
TextNode
HtmlBoldElement
TextNode
HtmlBreakRowElement
TextNode