C#でJavaScriptで作成されたテーブルをどうやって削り取ることができますか?

c# html-agility-pack html-table webclient

質問

私はWebページhttps://www.belastingdienst.nl/rekenhulpen/wisselkoersen/からHtmlAgilityPackを使ってテーブルを取得しようとしています。

これまでの私のコードは

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();

私の問題は、WebページがJavaScriptを使用してテーブルを作成し、JavaScriptを有効にする必要があることがWebページに表示されているため、読み込みしようとするとnull例外がスローされることです。

私はまた、 "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コンポーネントを使用すると問題なくWebページが表示されますが、テーブルを表示することはできません。

受け入れられた回答

F12は、どのブラウザでもあなたの友人です。

[ネットワーク]タブを選択すると、すべての情報がこのファイルに含まれていることがわかります。

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

(2018年7月のデータは、* .dd201807.xmlという名前のURLで保持されると思います)

C#を使用すると、そのURLに対してGETを行い、XMLとして解析する必要があります.HtmlAgilityPackを使用する必要はありません。現在の月を連結して正しいURLを選択する必要があります。

ロイカー・カイン・イット・ヘット・ニート・マッケン!


人気のある回答

WebClientはWebクライアントではなくHTTPクライアントであるため、JavaScriptは実行されません。必要なものはヘッドレス Webブラウザです。ヘッドレスWebブラウザのリストについては、このページを参照してください。私はそれらのどれも試していないので、私はここにお勧めを与えることはできません:

ヘッドレスブラウザfor C#(.NET)?




ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ