如何使用.NET的WebBrowser或mshtml.HTMLDocument动态生成HTML代码?

如何使用.NET的WebBrowser或mshtml.HTMLDocument动态生成HTML代码?

我读过的关于这个主题的大多数答案都指向System.Windows.Forms.WebBrowser类或来自Microsoft HTML Object Library程序集的COM接口mshtml.HTMLDocument。

WebBrowser类没有引导我到任何地方。以下代码无法检索由我的Web浏览器呈现的HTML代码:

[STAThread]public static void Main(){
    WebBrowser wb = new WebBrowser();
    wb.Navigate("https://www.google.com/#q=where+am+i");

    wb.DocumentCompleted += delegate(object sender, WebBrowserDocumentCompletedEventArgs e)
    {
        mshtml.IHTMLDocument2 doc = (mshtml.IHTMLDocument2)wb.Document.DomDocument;
        foreach (IHTMLElement element in doc.all)
        {
                    System.Diagnostics.Debug.WriteLine(element.outerHTML);
        }     
    };
    Form f = new Form();
    f.Controls.Add(wb);
    Application.Run(f);}

以上只是一个例子。我真的不想找到一个解决方法来找出我所在城镇的名称。我只需要了解如何以编程方式检索那种动态生成的数据。

(调用新的System.Net.WebClient.DownloadString(“ https://www.google.com/#q=where+am+i ”),将生成的文本保存到某处,搜索您当前所在城镇的名称找到了,如果你能找到它,请告诉我。)

但是,当我从我的网络浏览器(即或Firefox)访问“ https://www.google.com/#q=where+am+i ”时,我会在网页上看到我的城镇名称。在Firefox中,如果我右键单击城镇名称并选择“Inspect Element(Q)”,我会清楚地看到用HTML代码编写的城镇名称,这看起来与WebClient返回的原始HTML完全不同。

在我厌倦了玩System.Net.WebBrowser后,我决定给mshtml.HTMLDocument一个镜头,最后得到同样无用的原始HTML:

public static void Main(){
    mshtml.IHTMLDocument2 doc = (mshtml.IHTMLDocument2)new mshtml.HTMLDocument();
    doc.write(new System.Net.WebClient().DownloadString("https://www.google.com/#q=where+am+i"));

    foreach (IHTMLElement e in doc.all)
    {
            System.Diagnostics.Debug.WriteLine(e.outerHTML);
    }}

我想必须有一种优雅的方式来获取这种信息。现在,我能想到的是将一个WebBrowser控件添加到表单中,让它导航到相关的URL,发送键“CLRL,A”,并将页面上显示的任何内容复制到剪贴板并尝试解析它。不过,这是一个可怕的解决方案。


拉风的咖菲猫
浏览 1272回答 2
2回答

哈士奇WWW

您的网络浏览器代码看起来很合理 - 等待获取当前内容的内容。不幸的是,没有官方的“我已经完成了执行JavaScript,随意窃取内容”来自浏览器或JavaScript的通知。某些活动等待(不是Sleep但Timer可能)是必要的并且是特定于页面的。即使您使用无头浏览器(即PhantomJS),您也会遇到同样的问题。
打开App,查看更多内容
随时随地看视频慕课网APP