首页 > 解决方案 > SelectNodes 未正确拉出所有子节点

问题描述

我正在尝试从网页获取产品列表。我正在使用下面的 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

解决方案


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

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

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

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

推荐阅读