Получить коллекцию списка тегов <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.

Другие вопросы по тегам