我想从维基百科页面获取歌曲标题列表(" 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中列表项标签的集合。
我尝试创建一个新的解析器并解析div_mw_content_ltr的innerhtml,但该成员不存在。
我已经在stackoverflow及更高版本上搜索了所有的angleharp标签,但无法找到解决方案。 我觉得在你甚至可以理解如何使用anglesharp之前需要解析html和查询选择器之类的一些基本知识,所以作为一方,我也欣赏任何资源链接到我得到更好的理解如何实际使用anglesharp库。
感谢您抽出宝贵时间阅读。
答案 0 :(得分:1)
<强>问题强>
您的div_mw_content_ltr
是IEnumerable<IElement>
,因为这是Where
返回的内容。所以在它上面使用All
是一个不同的方法,如果所有元素都满足你的条件,它只返回true或false。它返回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 Selector syntax,因此它不是AngleSharp特有的。如果你曾经做过CSS,那么这应该是熟悉的。
如果您还没有,请阅读wiki获取AngleSharp。