【问题标题】:Get a collection of list <li> tags from html string using Anglesharp使用 Anglesharp 从 html 字符串中获取列表 <li> 标签的集合
【发布时间】:2018-04-09 08:34:38
【问题描述】:

我正在尝试从维基百科页面(“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 的 innerhtml,但该成员不存在。

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

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

【问题讨论】:

    标签: c# html parsing anglesharp


    【解决方案1】:

    问题

    您的div_mw_content_ltrIEnumerable&lt;IElement&gt;,因为这是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");
    

    使用Descendents 代替All,它返回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 表示获取所有 divs 的 css 类 mw-category,然后所有 lis 在其中。

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

    如果您还没有,请阅读 wiki 了解 AngleSharp。

    【讨论】:

    • 优秀的答案,同时兼具全面性和简洁性。感谢您的宝贵时间,谢谢。也感谢您的链接。
    猜你喜欢
    • 2012-01-19
    • 2017-02-13
    • 1970-01-01
    • 2011-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-23
    • 2013-08-09
    相关资源
    最近更新 更多