如何在C#中刮取用JavaScript创建的表

时间:2018-06-24 17:23:44

标签: c# html-table webclient html-agility-pack

我正在尝试使用HtmlAgilityPack从网页https://www.belastingdienst.nl/rekenhulpen/wisselkoersen/中获取表格。

到目前为止,我的代码是

WebClient webClient = new WebClient();
        string page = webClient.DownloadString("https://www.belastingdienst.nl/rekenhulpen/wisselkoersen/");

        HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
        doc.LoadHtml(page);

        List<List<string>> table = doc.DocumentNode.SelectSingleNode("//table[@class='list_result Result']")
                    .Descendants("tr")
                    .Skip(1)
                    .Where(tr => tr.Elements("td").Count() > 1)
                    .Select(tr => tr.Elements("td").Select(td => td.InnerText.Trim()).ToList())
                    .ToList();

我的问题是该网页使用JavaScript创建了表格,当我尝试读取该表格时,它抛出了null异常,因为该网页显示我必须启用JavaScript。

我也尝试使用“ GET”方法

 string Url = "https://www.belastingdienst.nl/rekenhulpen/wisselkoersen/";
HttpWebRequest myRequest = (HttpWebRequest)WebRequest.Create(Url);
myRequest.Method = "GET";
            WebResponse myResponse = myRequest.GetResponse();
StreamReader sr = new StreamReader(myResponse.GetResponseStream(), System.Text.Encoding.UTF8);
string result = sr.ReadToEnd();
sr.Close();
            myResponse.Close();

具有相同的结果。 我已经在Internet Explorer中启用了JavaScript,并且还更改了注册表

if (Environment.Is64BitOperatingSystem)
        Regkey = Microsoft.Win32.Registry.LocalMachine.OpenSubKey(@"SOFTWARE\\Wow6432Node\\Microsoft\\Internet Explorer\\MAIN\\FeatureControl\\FEATURE_BROWSER_EMULATION", true);
    else  //For 32 bit machine
        Regkey = Microsoft.Win32.Registry.LocalMachine.OpenSubKey(@"SOFTWARE\\Microsoft\\Internet Explorer\\Main\\FeatureControl\\FEATURE_BROWSER_EMULATION", true);

如果我使用WebBrowser组件,则可以毫无问题地看到网页,但仍然无法将表列出。

2 个答案:

答案 0 :(得分:2)

F12是您在任何浏览器中的朋友。

选择“网络”标签,您会注意到所有信息都在此文件中:

https://www.belastingdienst.nl/data/douane_wisselkoersen/wks.douane.wisselkoersen.dd201806.xml

(我假设2018年7月的数据将保存在名为* .dd201807.xml的URL中)

使用C#,您将需要对该URL进行GET并将其解析为XML,而无需使用HtmlAgilityPack。您需要构造与当前月份连接的当前年份,以选择正确的URL。

Leuker kan ik het niet maken!

答案 1 :(得分:0)

WebClient是http客户端,而不是Web浏览器,因此它不会执行JavaScript。需要一个 headless 网络浏览器。请参阅此页面以获取无头Web浏览器的列表。不过我还没有尝试过,所以在这里我不能给你推荐:

Headless browser for C# (.NET)?