【问题标题】:Unable to get Child Categories inside <ul> using HtmlAgilityPack C# ASP.NET无法使用 HtmlAgilityPack C# ASP.NET 在 <ul> 中获取子类别
【发布时间】:2016-03-09 07:31:22
【问题描述】:

我是 Webscraping 的新手,我正在尝试使用 ASP.NET C# 从带有 HTMLAgilityPack 的网站获取数据。我试图解析的 HTML 结构是:

<li class='subsubnav' id='new-women-clothing'>
    <span class='cat-name'>CLOTHING</span>

    <ul>
        <li><a href="/womenswear/womens-just-in" id="just-in">Just In</a></li>

        <li><a href="/womenswear/new-season-exclusives" id="exclusives">Exclusives</a></li>

        <li><a href="/womenswear/new-season-dresses" id="dresses-&-gowns">Dresses & Gowns</a></li>

        <li><a href="/womenswear/new-season-coats" id="coats">Coats</a></li>

        <li><a href="/womenswear/new-season-jackets" id="jackets">Jackets</a></li>

        <li><a href="/womenswear/new-season-shirts-and-blouses" id="shirts-&-blouses">Shirts & Blouses</a></li>

        <li><a href="/womenswear/new-season-tops" id="tops">Tops</a></li>

        <li><a href="/womenswear/new-season-knitwear" id="knitwear">Knitwear</a></li>

        <li><a href="/womenswear/new-season-sweatshirts" id="sweatshirts">Sweatshirts</a></li>

        <li><a href="/womenswear/new-season-skirts-and-shorts" id="skirts-&-shorts">Skirts & Shorts</a></li>

        <li><a href="/womenswear/new-season-trousers" id="trousers">Trousers</a></li>

        <li><a href="/womenswear/new-season-jumpsuits" id="jumpsuits">Jumpsuits</a></li>

        <li><a href="/womenswear/new-season-jeans" id="jeans">Jeans</a></li>

        <li><a href="/womenswear/new-season-swimwear" id="swimwear">Swimwear</a></li>

        <li><a href="/womenswear/new-season-lingerie" id="lingerie">Lingerie</a></li>

        <li><a href="/womenswear/new-season-nightwear" id="nightwear">Nightwear</a></li>

        <li><a href="/womenswear/sportswear" id="sportswear">Sportswear</a></li>

        <li><a href="/womenswear/ski-wear" id="ski-wear">Ski Wear</a></li>

    </ul>

</li>

我得到了父类别,在这种情况下是完美的服装,但我无法在 ul 中获取元素。

这是我的 C# 代码:

var html = new HtmlDocument();
html.LoadHtml(new WebClient().DownloadString("http://www.harrods.com/men/t-shirts?icid=megamenu_MW_clothing_t_shirts"));
var root = html.DocumentNode;
var nodes = root.Descendants();
var totalNodes = nodes.Count();
var dt = root.Descendants().Where(n => n.GetAttributeValue("class", "").Equals("cat-name"));

foreach(var x in dt)
{
    foreach (var element in x.Descendants("ul"))
    {
        child_data.Add(new cat_childs(element.InnerText));
    }

    data.Add(new Categories(x.InnerText,child_data));
}

test.DataSource = data;
test.DataBind();

那么如何获取&lt;ul&gt;内锚标签的链接和文本呢?

【问题讨论】:

  • ul 标签不是您的 span 标签的后代...
  • @FKutsche 好吧,所以
      实际上是
    • 的后代,我说得对吗>?
  • 是的,可能是这样的:var ul = root.SelectSingleNode("./li[@id='new-women-clothing']/ul");
  • 好的。谢谢让我试试这个。

标签: c# asp.net web-scraping html-agility-pack


【解决方案1】:

如果您想将迭代基于spanclass='cat-name',那么目标ulspan 的关系是跟随兄弟 而不是后代。您可以使用SelectNodes() 从当前的span 获取以下兄弟元素,如下所示:

foreach (var x in dt)
{
    foreach (var element in x.SelectNodes("following-sibling::ul/li/a"))
    {
        child_data.Add(new cat_childs(element.InnerText));
    }

    data.Add(new Categories(x.InnerText,child_data));
}

更新:

似乎实际问题在于child_data 变量在外部循环之外声明。这意味着您不断将项目添加到同一个 child_data 实例。尝试在外部循环中声明它,紧跟在foreach (var x in dt){ 之后。或者,您可以将整个代码编写为 LINQ 表达式,如下所示:

var data = (from d in dt
            let child_data = x.SelectNodes("following-sibling::ul/li/a")
                              .Select(o => new cat_childs(o.InnerText))
                              .ToList()
            select new Categories(x.InnerText, child_data)
           ).ToList();

【讨论】:

  • 还有一个问题,它正在获取数据,但现在的问题是它没有根据 span 添加
      元素,而是添加了所有下一个
        元素。
  • @BilalAmjad 看起来实际问题不在于 XPath 获取错误的 ul 元素。用于存储所有匹配的ul 元素的child_data 大致相同。请参阅更新部分了解建议的解决方案
【解决方案2】:
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-17
  • 1970-01-01
  • 1970-01-01
  • 2015-08-14
相关资源
最近更新 更多