【问题标题】:WebBrowser - empty DocumentTextWebBrowser - 空 DocumentText
【发布时间】:2012-01-21 12:10:29
【问题描述】:

我正在尝试使用WebBrowser 类,但它当然不起作用。

我的代码:

WebBrowser browser = new WebBrowser();
browser.Navigate("http://www.google.com");

while(browser.DocumentText == "")
{
    continue;
}
string html = browser.DocumentText;

browser.DocumentText 始终为 ""。为什么?

【问题讨论】:

  • 嗯,马上,我几乎可以保证Navigate 不是一个异步函数,因此DocumentText 在 Navigate 返回后不会改变——换句话说,这将是一个无限每当DocumentText 为空时循环。

标签: c# browser


【解决方案1】:

在当前线程完成它的工作之前,WebBrowser 不会完成它的工作,如果你把它改成这样:

        WebBrowser browser = new WebBrowser();
        browser.Navigate("http://www.google.com");
        browser.Navigated += (s, e) =>
            {
                var html = browser.DocumentText;
            };

变量将被设置。

但是,正如其他人所提到的,完成的文档是一个更好的附加事件,因为那时,整个文档都将完成(适当的名称!)

        WebBrowser browser = new WebBrowser();
        browser.Navigate("http://www.google.com");

        browser.DocumentCompleted += (s, e) =>
            {
                var html = browser.DocumentText;
                html.ToString();
            };

【讨论】:

  • 它可以工作,但它不会使用 javascript 加载 HTML。我可以使用 HttpWebRequest,但我需要 javascript。帮助我。
  • @carck3r “需要 javascript”是什么意思? javascript 将内联并通过这两种方法中的任何一种加载,或者可以通过单独的 Web 调用访问。
  • @carck3r 如果您在典型浏览器中查看该页面的源代码,您会看到类似<noscript>Update Your Browser or Enable Javascript.</noscript> 的内容,这些内容已内置在页面中。如果您想要一些可以为您解析 javascript 的东西,您必须自己编写。 webbrowser 控件将在 web 表单中为您显示它,但会为您解析 javascript。
  • @carck3r WebBrowser 使用 IE 渲染引擎。如果您要求文档文本,您将得到与在 IE 中查看源代码相同的内容。但演示文稿也将与 IE 渲染引擎相同,它会像 IE 一样解析和评估 javascript。如果没有特定于域的信息,实际上不可能得到您所要求的内容,因为 javascript 并不总是停止修改页面。它可以不断地修改那个页面。
【解决方案2】:

试试这样的

string url = string.Empty:
string html = "http://www.google.com/";
string url = html;
if (!url.StartsWith("http://") && !url.StartsWith("https://"))
{
   url = "http://" + url;
}
browser.Navigate(new Uri(url)); 

在必要时将其替换到您的 While 循环中

【讨论】:

  • 我不明白这是怎么做到的。
  • 哎呀我忘了解决文档部分..我的印象是 URL 不起作用..我的错误
【解决方案3】:

附加到DocumentCompleted事件,代码如下

browser.DocumentCompleted += (s, e) =>
{
    string html = browser.DocumentText;
};

【讨论】:

    【解决方案4】:

    如果你需要 DocumentText,你应该处理 DocumentCompleted 事件

      browser.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(browser_DocumentCompleted);
    

    见下方活动

    void browser_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
        {
    
            WebBrowser wb = (WebBrowser)sender;
            string text = wb.DocumentText;
    
    }
    

    【讨论】:

      【解决方案5】:

      您应该使用DocumentCompleted 事件,如果您没有WebForms 应用程序,可能还需要ApplicationContext。

      static class Program
      {
          [STAThread]
          static void Main()
          {
              Context ctx = new Context();
              Application.Run(ctx);
      
              // ctx.Html; -- your html
          }
      }
      
      class Context : ApplicationContext
      {
          public string Html { get; set; }
      
          public Context()
          {
              WebBrowser browser = new WebBrowser();
              browser.AllowNavigation = true;
              browser.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(browser_DocumentCompleted);
              browser.Navigate("http://www.google.com");
          }
      
          void browser_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
          {
              Html = ((WebBrowser)sender).DocumentText;
              this.ExitThread();
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2013-08-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-03-14
        • 2013-08-25
        • 2016-06-23
        • 2016-06-30
        相关资源
        最近更新 更多