c# - 如何在 AngleSharp 中解析来自匿名 block 的文本?

标签 c# anglesharp

我正在使用 AngleSharp 解析网站内容,但我遇到了匿名 block 问题。

查看示例代码:

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-likes 的数字,输出为:

Hello, world 1

Yet another helloworld 25

我尝试过类似 product.FirstElementChild.NextElementSibling.Text(); 但链接元素的下一个同级元素是 div.comments-likes,而不是匿名 block 。它显示:

1

25

因此,匿名 block 被跳过。 :(

我发现的最佳解决方法是删除所有阻止 block ,例如:

product.QuerySelector(".comments-likes").Remove();
var productTitle = product.Text().Trim();

解析来自匿名 block 的文本的更好方法是什么?

最佳答案

文本被建模为 TextNode,它是元素、注释节点、处理指令等旁边的节点类型。这就是为什么 NextElementSibling 你试过没有在结果中包含文本,因为它打算只返回元素,顾名思义。

您可以通过遍历 divChildNodes 获取直接位于产品 div 中的文本节点,然后按 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());
}

dotnetfiddle demo

请注意,元素之间的换行符也是文本节点,因此我们需要在上面的演示中将其过滤掉。

关于c# - 如何在 AngleSharp 中解析来自匿名 block 的文本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42736218/

相关文章:

c# - LINQ 计算 SortedList<dateTime,double> 的移动平均值

c# - AngleSharp 文本元素解析

javascript - 使用 AngleSharp 在 C# 中解析 JavaScript 网页

c# - AngleSharp - 处理自闭合标签

c# - 显示从 NuGet 下载的组件

c# - 如何在 ASP.net 中的 IronPython 库上导入第 3 方 Python 库

c# - 在类属性的 'value' 自动属性中设置 'set' 上的属性

c# - 如何在新行中用特定元素替换多个 <br/> 标签?

c# - 如何将多个 CSS 声明合并为速记

c# - AngleSharp Html Parser 线程安全吗?