【问题标题】:HtmlAgilityPack getting <Item> tagsHtmlAgilityPack 获取 <Item> 标签
【发布时间】:2013-12-25 19:55:15
【问题描述】:

我正在尝试使用 HTMLAgilityPack 来解析 html 页面并获取 atom:links 其中包含在 item tags 中。这是 html 的示例:

<item><atom:link href="http://www.nytimes.com/2013/12/09/world/asia/justice-for-abused-
    afghan-women-still-elusive-un-report-says.html?partner=rss&amp;emc=rss" 
    rel="standout" />

我试图通过执行以下操作仅获取item 标签中的atom:link

        List<string> urlList = new List<string>();
        HtmlAgilityPack.HtmlWeb nytRssPage = new HtmlAgilityPack.HtmlWeb();
        HtmlAgilityPack.HtmlDocument nytRssDoc = new HtmlAgilityPack.HtmlDocument();
        nytRssDoc = nytRssPage.Load(rssUrl);

        var items = nytRssDoc.DocumentNode.Descendants("item").ToList();// list of <item> tags
        foreach (var item in items)
        {
            var atomLink = item.SelectSingleNode("atom:link");
            string articleUrl = atomLink.InnerText;
            urlList.Add(articleUrl);
        }

urlList 是空的,我想我做错了什么。 如果有人能指出我的解决方案,那就太好了,在此先感谢。

【问题讨论】:

  • Atom 是一个有效的 XML 结构。为什么要使用 HtmlAgilityPack 来解析它?至于获取 atomLlink 标签,您可能需要使用 /link(没有命名空间 atom)或使用 local-name 函数 stackoverflow.com/a/8181480/736079
  • @jessehouwing,感谢您的回答。如果是这样,我只想解析 标签中包含的链接。我仍然认为我使用的语法是错误的
  • @jessehouwing,我现在尝试了 Descendants("link") ,但没有成功,然后我尝试了 SelectNodes("//link") - 但效果不佳.如果您有任何建议,我将不胜感激,提前感谢!

标签: c# parsing tags html-agility-pack


【解决方案1】:

要解析一个 xml,你不需要 HtmlAgilityPack

var url = "http://www.nytimes.com/services/xml/rss/nyt/International.xml";
var xDoc = XDocument.Load(url);

XNamespace atom = "http://www.w3.org/2005/Atom";

var items = xDoc.Descendants("item")
            .Select(item => new
            {
                Title = (string)item.Element("title"),
                Url = item.Element(atom + "link") != null 
                          ? (string)item.Element(atom + "link").Attribute("href") 
                          : (string)item.Element("link")
            })
            .ToList();

或者,您也可以使用SyndicationFeed

var url = "http://www.nytimes.com/services/xml/rss/nyt/International.xml";
var xDoc = XDocument.Load(url);
SyndicationFeed feed = SyndicationFeed.Load(xDoc.CreateReader());

现在你可以循环feed.Items

【讨论】:

  • 感谢您的精彩回答!
【解决方案2】:
var doc = new HtmlDocument();
doc.LoadHtml(
    "<item><atom:link href=\"http://www.nytimes.com/2013/12/09/world/asia/justice-for-abused-afghan-women-still-elusive-un-report-says.html?partner=rss&amp;emc=rss\" rel=\"standout\" />");

var urls = doc.DocumentNode
    .SelectNodes("//item/*[name()='atom:link']")
    .SelectMany(node => node.Attributes.AttributesWithName("href").Select(attr => attr.Value))
    .ToList();

【讨论】:

    【解决方案3】:

    以下代码提取所有链接:

     var links = doc.DocumentNode.SelectNodes(@"//item/*[name()='atom:link']/@href");
    

    如果你想从每个项目节点中获取它们,你需要使用:

     var link = item.SelectSingleNode(@"./*[name()='atom:link']/@href");
    

    我仍然建议您以适当的 XML 结构(使用 Linq to XML 或 XPathNavigable)或使用专用的 Atom 库(如 Atom.NETWindows feeds APIGoogle Feed API)加载 Atom 提要。

    【讨论】:

    • 感谢您的回答! var link = item.SelectSingleNode(@"./*[name()='atom:link']/@href") 中的“项目”是什么?
    • item 应该是来自foreach (var item in items)的项目
    猜你喜欢
    • 2012-12-28
    • 1970-01-01
    • 1970-01-01
    • 2011-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多