【问题标题】:How can I scrape a table that is created with JavaScript in c#如何在 c# 中抓取使用 JavaScript 创建的表
【发布时间】:2018-12-03 08:51:37
【问题描述】:

我正在尝试使用 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 组件,我可以毫无问题地查看网页,但仍然无法列出要列出的表格。

【问题讨论】:

  • 你需要无头浏览器。 html由js生成。
  • 为什么不使用 WebBrowser 组件并从该组件公开的 DOM 中获取表格?

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


【解决方案1】:

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!

【讨论】:

  • 太棒了,这正是我想要的,也许更好。我正在搜索表格,但找不到任何代码。网络标签的提示很棒。
  • 我对以下 url 有同样的问题,我需要获取由 javascript 创建的 div packageTabContainer 中的表数据。你能建议吗? ikea.com/qa/en/catalog/products/60368726
  • @KhanEngineer 我没有看到具有该 ID 的 div。我建议问一个问题。
  • 包: 1
    货号 包装 宽度 高度 长度 直径 重量
    60368726 1 20 厘米 3 厘米 27 厘米 - 0.06 公斤
    在这里
  • 这个 div 位于 id 为 packageInfo 的 div 中
【解决方案2】:

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

Headless browser for C# (.NET)?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-23
    • 1970-01-01
    • 2018-12-30
    • 2018-10-01
    • 2015-04-27
    • 2010-10-14
    • 2015-09-26
    相关资源
    最近更新 更多