使用 Anglesharp 从 html 字符串中获取列表 <li> 标签的集合

Get a collection of list <li> tags from html string using 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 是假的,我希望它是 div_mw_content_ltr.

中列表项标签的集合

我试图创建一个新的解析器并解析 div_mw_content_ltr 的内部 html,但该成员不存在。

我已经在 Whosebug 及其他平台上搜索了所有 anglesharp 标签,但找不到解决方案。 我觉得在您甚至可以理解如何使用 anglessharp 之前,需要一些解析 html 和查询选择器等基础知识,所以作为一个方面,我也很感激任何资源链接到我得到的地方更好地了解如何实际使用 anglesharp 库。

感谢您抽空阅读。

问题

您的 div_mw_content_ltrIEnumerable<IElement> 因为那是 Where return。所以在它上面使用 All 是一种不同的方法,如果所有元素都满足你的条件,它只是 returns true 或 false。它 return 是错误的,因为列表中的唯一元素是 div,它不会递归 return 所有符合条件的元素。


让它与 LINQ 一起工作

Where 更改为 First 因为您只需要一个,这也允许使用 Descendents:

var div_mw_content_ltr = doc.All.First(tag => tag.LocalName == "div" && tag.GetAttribute("class") == "mw-category");

而不是All,使用Descendents,其中return是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 class of mw-category,然后获取其中的所有 li

查询选择器的语法基本上是 CSS Selector syntax,因此它不是 AngleSharp 特有的语法。如果您曾经做过 CSS 那么这应该很熟悉。

如果您还没有阅读过 AngleSharp 的 wiki