如何使用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# 的更多示例,我建议您查看:

Selenium C# tutorial