SelectNodes 没有正确拉动所有子节点
SelectNodes not pulling all child nodes correctly
我正在尝试从网页获取产品列表。我正在使用下面的 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();
我认为这可能是因为某些数据是在浏览器端使用 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"];
我正在尝试从网页获取产品列表。我正在使用下面的 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();
我认为这可能是因为某些数据是在浏览器端使用 Javascript 加载的。
如果您查看 html
所有产品都在 <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"];