如何在 AngleSharp 中解析来自匿名块的文本?
How to parse text from anonymous block in AngleSharp?
我正在使用 AngleSharp 解析网站内容,但我遇到了匿名块问题。
查看示例代码:
var parser = new HtmlParser();
var document = parser.Parse(@"<body>
<div class='product'>
<a href='#'><img src='img1.jpg' alt=''></a>
Hello, world
<div class='comments-likes'>1</div>
</div>
<div class='product'>
<a href='#'><img src='img2.jpg' alt=''></a>
Yet another helloworld
<div class='comments-likes'>25</div>
</div>
<body>");
var products = document.QuerySelectorAll("div.product");
foreach (var product in products)
{
var productTitle = product.Text();
productTitle.Dump();
}
因此,productTitle 包含来自 div.comments 个赞的数字,输出为:
Hello, world 1
Yet another helloworld 25
我试过 product.FirstElementChild.NextElementSibling.Text();
之类的东西,但 link 元素的下一个同级元素是 div.comments-likes,而不是匿名块。它显示:
1
25
因此,匿名块被跳过。 :(
我发现的最佳解决方法是删除所有阻止块,例如:
product.QuerySelector(".comments-likes").Remove();
var productTitle = product.Text().Trim();
是从匿名块解析文本的更好方法吗?
文本被建模为TextNode
,它是元素、注释节点、处理指令等旁边的类型的节点。这就是为什么NextElementSibling
你试过没有在结果中包含文本,因为它只打算 return 元素,顾名思义。
您可以获取直接位于产品 div
中的文本节点,方法是遍历 div
的 ChildNodes
,然后按 NodeType
进行过滤,例如:
var products = document.QuerySelectorAll("div.product");
foreach (var product in products)
{
var productTitle = product.ChildNodes
.First(o => o.NodeType == AngleSharp.Dom.NodeType.Text
&& o.TextContent.Trim() != "");
Console.WriteLine(productTitle.TextContent.Trim());
}
请注意,元素之间的换行符也是文本节点,因此我们需要在上面的演示中将其过滤掉。
我正在使用 AngleSharp 解析网站内容,但我遇到了匿名块问题。
查看示例代码:
var parser = new HtmlParser();
var document = parser.Parse(@"<body>
<div class='product'>
<a href='#'><img src='img1.jpg' alt=''></a>
Hello, world
<div class='comments-likes'>1</div>
</div>
<div class='product'>
<a href='#'><img src='img2.jpg' alt=''></a>
Yet another helloworld
<div class='comments-likes'>25</div>
</div>
<body>");
var products = document.QuerySelectorAll("div.product");
foreach (var product in products)
{
var productTitle = product.Text();
productTitle.Dump();
}
因此,productTitle 包含来自 div.comments 个赞的数字,输出为:
Hello, world 1
Yet another helloworld 25
我试过 product.FirstElementChild.NextElementSibling.Text();
之类的东西,但 link 元素的下一个同级元素是 div.comments-likes,而不是匿名块。它显示:
1
25
因此,匿名块被跳过。 :(
我发现的最佳解决方法是删除所有阻止块,例如:
product.QuerySelector(".comments-likes").Remove();
var productTitle = product.Text().Trim();
是从匿名块解析文本的更好方法吗?
文本被建模为TextNode
,它是元素、注释节点、处理指令等旁边的类型的节点。这就是为什么NextElementSibling
你试过没有在结果中包含文本,因为它只打算 return 元素,顾名思义。
您可以获取直接位于产品 div
中的文本节点,方法是遍历 div
的 ChildNodes
,然后按 NodeType
进行过滤,例如:
var products = document.QuerySelectorAll("div.product");
foreach (var product in products)
{
var productTitle = product.ChildNodes
.First(o => o.NodeType == AngleSharp.Dom.NodeType.Text
&& o.TextContent.Trim() != "");
Console.WriteLine(productTitle.TextContent.Trim());
}
请注意,元素之间的换行符也是文本节点,因此我们需要在上面的演示中将其过滤掉。