Получить коллекцию списка тегов <li> из строки html, используя Anglesharp
Я пытаюсь получить список названий песен на странице википедии (" https://en.wikipedia.org/wiki/Category:The_Kinks_songs")
Вот код, который я сейчас пытаюсь
//Get page source and parse it
string pageSource = PageSource.Get(url);// own method
HtmlParser parser = new HtmlParser();
var doc = parser.Parse(pageSource);
//Get div tag with class="mw-category"
var div_mw_content_ltr = doc.All.Where(tag => tag.LocalName == "div" && tag.GetAttribute("class") == "mw-category");
//Get all li tags
var li = div_mw_content_ltr.All(tag => tag.LocalName == "li");
List<string> LS = new List<string>();
foreach (var item in div_mw_content_ltr)
{
string tmp = item.TextContent;
LS.Add(tmp);
}
return LS;
Я действительно новичок в этом деле. var li имеет значение false, где я ожидал, что это будет коллекция тегов элементов списка в div_mw_content_ltr.
Я попытался создать новый синтаксический анализатор и разобрать innerhtml div_mw_content_ltr, но этот член не существует.
Я обыскал все теги anglesharp в stackru и за его пределами, но не могу найти решение. У меня такое ощущение, что некоторые базовые знания парсинга html и селекторов запросов и тому подобное необходимы еще до того, как вы сможете понять, как использовать anglesharp, поэтому я также буду благодарен за любые ссылки на ресурсы, где я получаю лучшее понимание того, как на самом деле использовать библиотеку anglesharp.
Спасибо, что нашли время, чтобы прочитать.
1 ответ
вопрос
Ваш div_mw_content_ltr
это IEnumerable<IElement>
так как это то, что Where
возвращается. Итак, используя All
это другой метод, он просто возвращает истину или ложь, если все элементы удовлетворяют вашему условию. Он возвращает false, потому что единственный элемент в списке - это div, он не возвращает рекурсивно все элементы, соответствующие вашему условию.
Чтобы заставить его работать с LINQ
+ Изменить Where
в First
так как вы ожидаете только одного, это также позволяет использовать Descendents
:
var div_mw_content_ltr = doc.All.First(tag => tag.LocalName == "div" && tag.GetAttribute("class") == "mw-category");
Вместо All
использовать Descendents
который возвращает всех потомков div и затем использует Where
фильтровать:
var li = div_mw_content_ltr.Descendents().Where(tag => tag.NodeName.ToLower() == "li");
Селекторы запросов
AngleSharp основан на DOM, поэтому я бы использовал селекторы запросов QuerySelector
(первый матч) или QuerySelectorAll
(все совпадения).
Эквивалентом LINQ выше будет:
var li = doc.QuerySelectorAll("div.mw-category li");
div.mv-category li
значит получить все div
с классом CSS mw-category
а потом все li
в этом.
Синтаксис для селекторов запросов - это в основном синтаксис CSS-селекторов, поэтому он не является чем-то специфичным для AngleSharp. Если вы когда-либо делали CSS, это должно быть знакомо.
А если вы еще этого не сделали, прочитайте вики для AngleSharp.