如何解析AngleSharp中匿名块的文本?

时间:2017-03-11 14:11:37

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

  

你好,世界1

     

另一个helloworld 25

我尝试了类似product.FirstElementChild.NextElementSibling.Text();的内容,但是链接元素的下一个兄弟是div.comments-likes,而不是匿名阻止。它显示:

  

1

     

25

因此,跳过匿名块。 :(

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

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

解析匿名块中的文本是更好的方法吗?

1 个答案:

答案 0 :(得分:2)

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

您可以通过浏览NextElementSibling div然后按div进行过滤,直接找到位于产品ChildNodes内的文字节点,例如:< / p>

NodeType

<强> dotnetfiddle demo

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