如何在 c# 中抓取使用 JavaScript 创建的 table
How can I scrape a table that is created with JavaScript in c#
我正在尝试使用 HtmlAgilityPack 从网页 https://www.belastingdienst.nl/rekenhulpen/wisselkoersen/ 获取 table。
到目前为止我的代码是
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 创建了 table,当我尝试读取它时它抛出了空异常,因为该网页显示我必须启用 [=29] =].
我也试过用"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 组件,我可以毫无问题地查看网页,但我仍然无法列出 table。
F12 是您在任何浏览器中的朋友。
Select 网络选项卡,您会注意到所有信息都在此文件中:
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!
WebClient 是一个 http 客户端,不是网络浏览器,所以它不会执行 JavaScript。需要的是 headless 网络浏览器。请参阅此页面以获取无头 Web 浏览器列表。不过我没有尝试过任何一个,所以我不能在这里给你推荐:
Headless browser for C# (.NET)?
我正在尝试使用 HtmlAgilityPack 从网页 https://www.belastingdienst.nl/rekenhulpen/wisselkoersen/ 获取 table。
到目前为止我的代码是
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 创建了 table,当我尝试读取它时它抛出了空异常,因为该网页显示我必须启用 [=29] =].
我也试过用"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 组件,我可以毫无问题地查看网页,但我仍然无法列出 table。
F12 是您在任何浏览器中的朋友。
Select 网络选项卡,您会注意到所有信息都在此文件中:
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!
WebClient 是一个 http 客户端,不是网络浏览器,所以它不会执行 JavaScript。需要的是 headless 网络浏览器。请参阅此页面以获取无头 Web 浏览器列表。不过我没有尝试过任何一个,所以我不能在这里给你推荐:
Headless browser for C# (.NET)?