如何使用HtmlAgilityPack从股票网站获取特定数据
How to use HtmlAgilityPack to get specific data from stock website
我想从站点中提取号码数据,link https://www.vndirect.com.vn/portal/bao-cao-ket-qua-kinh-doanh/vjc.shtml
下面黄色突出显示图像中的数字:
我想提取黄色突出显示的数字,所以我用 C# 编写了这段代码:
var html = @"https://www.vndirect.com.vn/portal/bao-cao-ket-qua-kinh-doanh/vjc.shtml";
HtmlWeb web = new HtmlWeb();
web.UserAgent = "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36";
var htmlDoc = web.Load(html);
var node = htmlDoc.DocumentNode.SelectSingleNode("//*[@id='Listed_IncomeStatement_tableResult']/tbody/tr[1]/td[2]");
string strSo = node.OuterHtml;
Console.WriteLine(strSo);
但在 strSo
中我找不到黄色数字 (19,749,872)。
你能告诉我在那个网站上提取号码的方法吗???
抱歉我英文写得不好。
你遇到了问题,因为网站在加载页面后通过 AJAX 请求将数据加载到 table,但 HtmlAgilityPack 只能下载服务器直接发送给你的内容.
你可以通过查看它通过 HtmlWeb 下载的源代码来找到它;实际上,id为"Listed_IncomeStatement_tableResult"的Table标签中的DocumentNodeHTML在tbody中没有数据。
要避免这个问题,您应该使用Selenium WebDriver。
此扩展允许使用某些浏览器行为(例如 Firefox 或 Chrome)执行包含所有 javascript 的完整页面,然后返回完整的源代码执行后的页面。
在这里您可以找到要使用的驱动程序Chrome:Chrome Driver
导入所有库后,只需执行以下代码:
//!Make sure to add the path to where you extracting the chromedriver.exe:
IWebDriver driver = new ChromeDriver(@"Path\To\Chromedriver");
driver.Navigate().GoToUrl("https://www.vndirect.com.vn/portal/bao-cao-ket-qua-kinh-doanh/vjc.shtml");
之后,您将能够直接从驱动程序对象访问网页,例如:
IWebElement myField = driver.FindElementBy.Id("tools"));
使用 Chrome 驱动程序的唯一问题是它会打开浏览器来呈现所有内容。为避免这种情况,您可以尝试使用另一个驱动程序,如 PhantomJS,它的功能与 Chrome 相同,但不会打开任何 window.
要获得有关如何使用 Selenium WebDriver 和 C# 的更多示例,我建议您查看:
我想从站点中提取号码数据,link https://www.vndirect.com.vn/portal/bao-cao-ket-qua-kinh-doanh/vjc.shtml
下面黄色突出显示图像中的数字:
我想提取黄色突出显示的数字,所以我用 C# 编写了这段代码:
var html = @"https://www.vndirect.com.vn/portal/bao-cao-ket-qua-kinh-doanh/vjc.shtml";
HtmlWeb web = new HtmlWeb();
web.UserAgent = "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36";
var htmlDoc = web.Load(html);
var node = htmlDoc.DocumentNode.SelectSingleNode("//*[@id='Listed_IncomeStatement_tableResult']/tbody/tr[1]/td[2]");
string strSo = node.OuterHtml;
Console.WriteLine(strSo);
但在 strSo
中我找不到黄色数字 (19,749,872)。
你能告诉我在那个网站上提取号码的方法吗???
抱歉我英文写得不好。
你遇到了问题,因为网站在加载页面后通过 AJAX 请求将数据加载到 table,但 HtmlAgilityPack 只能下载服务器直接发送给你的内容.
你可以通过查看它通过 HtmlWeb 下载的源代码来找到它;实际上,id为"Listed_IncomeStatement_tableResult"的Table标签中的DocumentNodeHTML在tbody中没有数据。
要避免这个问题,您应该使用Selenium WebDriver。
此扩展允许使用某些浏览器行为(例如 Firefox 或 Chrome)执行包含所有 javascript 的完整页面,然后返回完整的源代码执行后的页面。
在这里您可以找到要使用的驱动程序Chrome:Chrome Driver
导入所有库后,只需执行以下代码:
//!Make sure to add the path to where you extracting the chromedriver.exe:
IWebDriver driver = new ChromeDriver(@"Path\To\Chromedriver");
driver.Navigate().GoToUrl("https://www.vndirect.com.vn/portal/bao-cao-ket-qua-kinh-doanh/vjc.shtml");
之后,您将能够直接从驱动程序对象访问网页,例如:
IWebElement myField = driver.FindElementBy.Id("tools"));
使用 Chrome 驱动程序的唯一问题是它会打开浏览器来呈现所有内容。为避免这种情况,您可以尝试使用另一个驱动程序,如 PhantomJS,它的功能与 Chrome 相同,但不会打开任何 window.
要获得有关如何使用 Selenium WebDriver 和 C# 的更多示例,我建议您查看: