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

时间:2018-04-09 08:34:39

标签: c# html parsing anglesharp

我想从维基百科页面获取歌曲标题列表(&#34; https://en.wikipedia.org/wiki/Category:The_Kinks_songs&#34;)

以下是我目前正在尝试的代码

//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库。

感谢您抽出宝贵时间阅读。

1 个答案:

答案 0 :(得分:1)

<强>问题

您的div_mw_content_ltrIEnumerable<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。