【问题标题】:SelectNodes not pulling all child nodes correctlySelectNodes 未正确拉出所有子节点
【发布时间】:2019-10-29 21:31:39
【问题描述】:

我正在尝试从网页中获取产品列表。我正在使用下面的 url 来测试我的应用程序,但它只提取了 40 个项目中的 10 个。我一直在调试器中挖掘并查看子节点,它将前 10 个显示为 li 项,其他 30 个显示为 div。当我查看显示为 div 的项目的内部文本时,它完全是空的。查看网页的 html 时,所有 40 项都列为 li 项。有谁知道为什么会这样?我需要做的就是正确显示所有 40 个项目,因为我现在只能看到前 10 个。

//Create URL
var url = "https://www.walmart.com/search/?query=apples";
var itemTweak = itemTextBox.Text.Replace(" ", "%20");
url += itemTweak;
//Creates a client for the webpage
var httpClient = new HttpClient();
var html = await httpClient.GetStringAsync(url);

//Allow information to be parsed
var htmlDocument = new HtmlAgilityPack.HtmlDocument();
htmlDocument.LoadHtml(html);

//Grabs everything inside the list
var ProductsHtml = htmlDocument.DocumentNode.SelectNodes("//ul[@class='search-result-gridview-items four-items']").ToList();

【问题讨论】:

    标签: c# html-agility-pack


    【解决方案1】:

    我认为这可能是因为某些数据是在浏览器端使用 Javascript 加载的。

    如果您查看html,所有产品都在<script id="searchContent" type="application/json"> 中的一个json 对象中

    也许你应该像这样从那里解析它们:

    var json = htmlDocument.DocumentNode.SelectSingleNode("//script[@id='searchContent']");
    //need Json.net for this to work...
    JObject.Parse(json.InnerText)["searchContent"]["preso"]["items"];
    

    【讨论】:

    • 这就像一个魅力!它甚至把所有东西都分开了,让我更容易找到。谢谢,我真的很感激。您怎么知道为这些参数输入什么?
    • @Mr.Finch - 这是一个很好的问题,我也困惑了很长一段时间......无论如何,一旦我在 html 中找到了 json,我就使用 LinqPad 来钻取对象。你可能已经知道了,但是现在有一些方法可以将它们转换为强类型的 C# 对象......这是一个很好的起点:newtonsoft.com/json/help/html/ToObjectComplex.htm
    • 实际上我今天才开始使用 json,这对我有很大帮助。我不知道你可以在没有 api 的情况下使用它,或者这可能是一个 api 而我只是不知道。
    猜你喜欢
    • 1970-01-01
    • 2021-10-27
    • 1970-01-01
    • 1970-01-01
    • 2012-12-28
    • 2019-03-04
    • 1970-01-01
    • 1970-01-01
    • 2015-06-07
    相关资源
    最近更新 更多