为什么 AngleSharp 不为交错文本生成 TextNodes?
Why doesn't AngleSharp generate TextNodes for interleaved text?
我正在尝试使用 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这一段的解析元素列表是:
- HtmlAnchorElement
- HtmlBoldElement
- HtmlBreakRowElement
有效地跳过元素之间的文本。我如何获得这个文本?我认为 AngleSharp 会为这些部分生成 TextNodes?
请注意,获取父级的完整 TextContent 并不是我想要做的,因为我实际上仍然需要元素的结构来了解什么是什么。
此行为实际上是 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
foreach (var element in content.ChildNodes)
Console.WriteLine(element.GetType().Name);
现在输出是:
TextNode
HtmlAnchorElement
TextNode
HtmlBoldElement
TextNode
HtmlBreakRowElement
TextNode
我正在尝试使用 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这一段的解析元素列表是:
- HtmlAnchorElement
- HtmlBoldElement
- HtmlBreakRowElement
有效地跳过元素之间的文本。我如何获得这个文本?我认为 AngleSharp 会为这些部分生成 TextNodes?
请注意,获取父级的完整 TextContent 并不是我想要做的,因为我实际上仍然需要元素的结构来了解什么是什么。
此行为实际上是 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
foreach (var element in content.ChildNodes)
Console.WriteLine(element.GetType().Name);
现在输出是:
TextNode
HtmlAnchorElement
TextNode
HtmlBoldElement
TextNode
HtmlBreakRowElement
TextNode