3

我正在尝试使用 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
  • HtmlBreakRow 元素

有效地跳过元素之间的文本。如何获取此文本?我认为 AngleSharp 会为这些部分生成 TextNodes 吗?

请注意,获取父级的完整 TextContent 不是我想要做的,因为我实际上仍然需要元素的结构来知道什么是什么。

4

1 回答 1

8

这种行为实际上是 DOM 规范所期望的。您可能没有意识到这一点,但您已经回答了自己的问题:)

这是您似乎不太正确的内容:Element != Node。您要求元素,但您正在寻找节点。

诸如 etc 之类的标签<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");

现在,这基本上是您一直在做的事情:

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

于 2016-01-30T17:26:04.727 回答