gpt4 book ai didi

c# - 为什么 AngleSharp 不为交错文本生成 TextNodes?

转载 作者:太空宇宙 更新时间:2023-11-04 14:31:30 24 4
gpt4 key购买 nike

我正在尝试使用 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 规范所期望的。你可能没有意识到这一点,但你已经回答了你自己的问题:)

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

<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

关于c# - 为什么 AngleSharp 不为交错文本生成 TextNodes?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35023960/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com