如何使用HtmlAgilityPack从股票网站获取特定数据

时间:2018-03-27 08:57:13

标签: c# web-scraping html-agility-pack

我想从网站中提取数字数据,链接https://www.vndirect.com.vn/portal/bao-cao-ket-qua-kinh-doanh/vjc.shtml

以下黄色高亮显示图片中的数字:

output

我想提取以黄色突出显示的数字,所以我用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)。 你能告诉我在那个网站上提取数字的方法吗? 对不起,我写英文不太好。

1 个答案:

答案 0 :(得分:0)

你遇到了一个问题,因为网站在加载页面后通过AJAX请求将数据加载到表中,但HtmlAgilityPack只能下载服务器直接发送给你的内容。

你可以通过查看通过HtmlWeb下载的源来找到它;实际上,Table标签中的DocumentNode HTML具有id" Listed_IncomeStatement_tableResult"在tbody中没有数据。

要避免此问题,您应该使用Selenium WebDriver

此扩展程序允许使用某些浏览器行为(例如Firefox或Chrome),它将执行包含其中所有javascript的完整页面,然后在执行完页面后返回完整的页面源。 / p>

您可以在此处找到使用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"));

Chromedriver唯一的问题是它会打开一个浏览器来呈现所有内容。为了避免这种情况,您可以尝试使用其他驱动程序,例如PhantomJS,它会像Chrome一样运行,但不会打开任何窗口。

要了解如何在C#中使用 Selenium WebDriver 的更多示例,我建议您查看:

Selenium C# tutorial