我正在尝试从网站上抓取产品名称。奇怪的是,我似乎只随机抓取了 12 个项目。我已经尝试了 HtmlAgilityPack 和 HTTPClient,我得到了相同的随机结果。这是我的 HtmlAgilityPack 代码:
using HtmlAgilityPack;
using System.Net.Http;
var url = @"http://www.roots.com/ca/en/men/tops/shirts-and-polos/";
HtmlWeb web = new HtmlWeb();
var doc = web.Load(url, "GET", proxy, new NetworkCredential(PROXY_UID, PROXY_PWD, PROXY_DMN));
var nodes = doc.DocumentNode.Descendants("div")
.Where(div => div.GetAttributeValue("class", string.Empty) == "product-name")
.Select(div => div.InnerText.Trim())
;
[更新 1] @CodingKuma 建议我试试 Selenium Webdriver。这是我使用 Selenium Webdriver 的代码:
IWebDriver chromeDriver = new ChromeDriver(@"C:\TEMP\Projects\Chrome\chromedriver_win32");
chromeDriver.Url = "http://www.roots.com/ca/en/men/tops/shirts-and-polos/";
var items = chromeDriver.FindElements(By.ClassName("product-name"));
items.Count().Dump();
chromeDriver.Quit();
我试过这段代码,但还是不行。该页面上有 20 多个项目,但我似乎只得到随机的 12 个。如何抓取该网站上的所有项目?
最佳答案
从 v1.5.0-beta92 开始,
HtmlAgilityPack 有一个 FromBrowser
方法,允许您等待所有您想要的元素准备就绪。
文档:http://html-agility-pack.net/from-browser
string url = "http://html-agility-pack/from-browser";
var web1 = new HtmlWeb();
var doc1 = web1.LoadFromBrowser(url, o =>
{
var webBrowser = (WebBrowser) o;
// WAIT until the dynamic text is set
return !string.IsNullOrEmpty(webBrowser.Document.GetElementById("uiDynamicText").InnerText);
});
var t1 = doc1.DocumentNode.SelectSingleNode("//div[@id='uiDynamicText']").InnerText
var web2 = new HtmlWeb();
var doc2 = web2.LoadFromBrowser(url, html =>
{
// WAIT until the dynamic text is set
return !html.Contains("<div id=\"uiDynamicText\"></div>");
});
var t2 = doc2.DocumentNode.SelectSingleNode("//div[@id='uiDynamicText']").InnerText
Console.WriteLine("Text 1: " + t1);
Console.WriteLine("Text 2: " + t2);
这里的技巧是找到可以告诉您页面何时准备就绪的信息,因为图书馆不可能知道。
关于c# - HtmlAgilityPack 和 Selenium Webdriver 返回随机结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45243042/