我尝试使用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>
当然,这段HTML包含了父元素等,但是这段HTML的解析元素的结果列表是:
有效地跳过元素之间的文本。我如何获得此文本?我认为AngleSharp会为这些部分生成TextNodes吗?
请注意,获取父级的完整TextContent并不是我想要做的事情,因为我实际上仍然需要元素的结构来知道它是什么。
答案 0 :(得分:6)
这种行为实际上是DOM规范所期望的。您可能没有意识到这一点,但您已经回答了自己的问题:)
以下是您似乎不太正确的:元素!=节点。你问了元素,但是你正在寻找节点。
像<a>
等标签最终作为元素,而文本节点是......好......节点,而不是元素。而且你要求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");
现在,这里基本上是you've been doing:
foreach (var element in content.Children)
Console.WriteLine(element.GetType().Name);
输出:
HtmlAnchorElement
HtmlBoldElement
HtmlBreakRowElement
以下是what you want:
foreach (var element in content.ChildNodes)
Console.WriteLine(element.GetType().Name);
现在输出是:
TextNode
HtmlAnchorElement
TextNode
HtmlBoldElement
TextNode
HtmlBreakRowElement
TextNode