C# 获取列表的集合<;李>;使用Anglesharp从html字符串中提取标记

C# 获取列表的集合<;李>;使用Anglesharp从html字符串中提取标记,c#,html,parsing,anglesharp,C#,Html,Parsing,Anglesharp,我正试图从维基百科页面(“”)获取歌曲标题列表 这是我目前正在尝试的代码 //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_con

我正试图从维基百科页面(“”)获取歌曲标题列表

这是我目前正在尝试的代码

//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;
//获取页面源代码并对其进行解析
字符串pageSource=pageSource.Get(url);//自己的方法
HtmlParser parser=新的HtmlParser();
var doc=parser.Parse(pageSource);
//使用class=“mw类别”获取div标记
var div_mw_content_ltr=doc.All.Where(tag=>tag.LocalName==“div”&&tag.GetAttribute(“类”)==“mw类别”);
//得到所有的李标签
var li=div\u mw\u content\u ltr.All(tag=>tag.LocalName==“li”);
列表LS=新列表();
foreach(部门mw内容中的var项目)
{
字符串tmp=item.TextContent;
LS.Add(tmp);
}
返回LS;
我对这东西真的很陌生。 var li是false,我希望它是div_mw_content_ltr中列表项标记的集合

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

我已经搜索了stackoverflow和beyond上的所有anglesharp标记,但找不到解决方案。 我觉得在你理解如何使用anglesharp之前,需要一些解析html和查询选择器的基础知识,因此作为一个方面,我也希望有任何资源链接可以帮助你更好地理解如何实际使用anglesharp库

感谢您抽出时间阅读。

问题

您的
div\u mw\u content\u ltr
是一个
IEnumerable
,因为这是
返回的内容。所以对它使用
All
是另一种方法,如果所有元素都满足您的条件,它只会返回true或false。它返回false,因为列表中唯一的元素是div,它不会递归返回与您的条件匹配的所有元素


让它与LINQ一起工作

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

var div_mw_content_ltr = doc.All.First(tag => tag.LocalName == "div" && tag.GetAttribute("class") == "mw-category");
使用返回div的所有子代的
子代,而不是
All
,然后使用
Where
过滤:

var li = div_mw_content_ltr.Descendents().Where(tag => tag.NodeName.ToLower() == "li");

查询选择器

AngleSharp是基于DOM的,因此我会使用查询选择器
QuerySelector
(第一个匹配项)或
queryselectoral
(所有匹配项)

与上述LINQ的等效值为:

var li = doc.QuerySelectorAll("div.mw-category li");
div.mv-category li
意味着使用css类
mw category
获取所有
div
s,然后获取其中的所有
li
s

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


如果你还没有读过AngleSharp的文章。

答案很好,既全面又简洁。谢谢你抽出时间,谢谢。也谢谢你的链接。