Как разобрать текст из анонимного блока в 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-лайков, вывод:
Привет, мир 1
Еще один helloworld 25
Я пробовал что-то вроде product.FirstElementChild.NextElementSibling.Text();
но следующий брат для элемента ссылки - div.comments-likes, а не анонимный блок. Это показывает:
1
25
Итак, анонимные блоки пропускаются.:(
Лучший обходной путь, который я нашел, - это удаление всех блокирующих блоков, например:
product.QuerySelector(".comments-likes").Remove();
var productTitle = product.Text().Trim();
Есть ли лучший способ для анализа текста из анонимного блока?
1 ответ
Текст моделируется как TextNode
это тип узла рядом с элементом, узел комментария, инструкция обработки и т. д. Вот почему NextElementSibling
вы пытались не включать текст в результат, поскольку он намеревался возвращать только элементы, как следует из названия.
Вы можете получить текстовые узлы, расположенные непосредственно в продукте div
проходя через div
"s 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());
}
dotnetfiddle demo
Обратите внимание, что переводы строк между элементами также являются текстовыми узлами, поэтому нам нужно отфильтровать их в приведенной выше демонстрации.