Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 无法通过WebBrowser获取呈现的html_C#_Webbrowser Control - Fatal编程技术网

C# 无法通过WebBrowser获取呈现的html

C# 无法通过WebBrowser获取呈现的html,c#,webbrowser-control,C#,Webbrowser Control,我想从网站上获取html代码。在浏览器中,我通常只需单击上下文菜单中的“查看页面源”或类似内容。但是我怎样才能使它自动化呢?我曾在WebBrowser类中尝试过,但有时不起作用。我不是网络开发者,所以我真的不知道我的方法是否有意义。我认为主要的问题是,有时我得到的html并不是所有代码都被执行的。因此它是未完成的。我对该网站有问题,例如: 我的代码(我已尝试使其变小,但可以自己运行): 使用系统; 使用System.Collections.Generic; 使用System.Runtime.In

我想从网站上获取html代码。在浏览器中,我通常只需单击上下文菜单中的“查看页面源”或类似内容。但是我怎样才能使它自动化呢?我曾在WebBrowser类中尝试过,但有时不起作用。我不是网络开发者,所以我真的不知道我的方法是否有意义。我认为主要的问题是,有时我得到的html并不是所有代码都被执行的。因此它是未完成的。我对该网站有问题,例如:

我的代码(我已尝试使其变小,但可以自己运行):

使用系统;
使用System.Collections.Generic;
使用System.Runtime.InteropServices;
使用System.Windows.Forms;
命名空间WebBrowserForm
{
内部静态类程序
{
[状态线程]
私有静态void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
对于(int i=0;i<10;i++)
{
Form1 f=新的Form1();
f、 ShowDialog();
}
//现在我可以检查Form1.List,看到一些html是最终的,而一些不是
}
}
公开课表格1:表格
{
公共静态列表=新列表();
私有常量字符串Url=”http://www.sreality.cz/en/search/for-sale/praha";
private System.Windows.Forms.WebBrowser webBrowser1;
公共表格1()
{
this.webBrowser1=new System.Windows.Forms.WebBrowser();
这个.SuspendLayout();
this.webBrowser1.Dock=System.Windows.Forms.DockStyle.Fill;
this.webBrowser1.Name=“webBrowser1”;
this.webBrowser1.TabIndex=0;
此选项为.resume布局(false);
Load+=新事件处理程序(Form1_Load);
this.webBrowser1.ObjectForScripting=new MyScript();
}
私有void Form1\u加载(对象发送方、事件参数e)
{
webBrowser1.导航(Url);
webBrowser1.DocumentCompleted+=新的WebBrowserDocumentCompletedEventHandler(webBrowser1\u DocumentCompleted);
}
私有无效webBrowser1\u文档已完成(对象发送者,WebBrowserDocumentCompletedEventArgs e)
{
如果(webBrowser1.ReadyState==WebBrowserReadyState.Complete)
{
//99%的网页使用最终html,但不幸的是,并非所有网页都使用最终html
字符串tst=webBrowser1.Document.GetElementsByTagName(“HTML”)[0].OuterHtml;
webBrowser1.DocumentCompleted-=新的WebBrowserDocumentCompletedEventHandler(webBrowser1\u DocumentCompleted);
Application.DoEvents();
webBrowser1.Navigate(“javascript:window.external.CallServerSideCode();”;
Application.DoEvents();
}
}
[ComVisible(true)]
公共类MyScript
{
public void CallServerSideCode()
{
HtmlDocument doc=((Form1)Application.OpenForms[0]).webBrowser1.Document;
字符串renderedHtml=doc.GetElementsByTagName(“HTML”)[0].OuterHtml;
//在这里,我有时获得完整的html,但有时与webBrowser1_DocumentCompleted方法中的相同
List.Add(renderedHtml);
((Form1)Application.OpenForms[0]).Close();
}
}
}
}
我希望在“webBrowser1_DocumentCompleted”方法中可以得到最终的html。它通常是有效的,但在这个网站上就不行了。所以我尝试在我自己的代码中获取html,应该在web站点->方法“CallServerSideCode”中执行。奇怪的是,有时我会得到最终的html(基本上和我通过浏览器手动完成的一样),但有时不会。我认为这个问题是因为我的脚本是在整个网站呈现之前启动的,而不是之后。但我不是很确定,因为这类事情离我的舒适区很远,我也不太明白我在做什么。我只是想用我在网上找到的东西

那么,有人知道代码有什么问题吗?或者更重要的是,如何从站点轻松获取最终html

感谢您的帮助。

您应该使用类下载HTML页面。无需显示控制


您需要方法
DownloadString

如果您将外部函数的调用添加到正文的末尾,并用Jquery“ondomready”函数将其包装,可能会有所帮助。我的意思是这样的:

private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
    if (webBrowser1.ReadyState == WebBrowserReadyState.Complete)
    {
        // Final html for 99% of web pages, but unfortunately not for all
        string tst = webBrowser1.Document.GetElementsByTagName("HTML")[0].OuterHtml;

        webBrowser1.DocumentCompleted -= new WebBrowserDocumentCompletedEventHandler(webBrowser1_DocumentCompleted);

        HtmlElement body = webBrowser1.Document.GetElementsByTagName("body")[0];
        HtmlElement scriptEl = webBrowser1.Document.CreateElement("script");
        IHTMLScriptElement element = (IHTMLScriptElement)scriptEl.DomElement;
        element.text = "$(function() { window.external.CallServerSideCode(); });";
        body.AppendChild(scriptEl);
    }
}

[ComVisible(true)]
public class MyScript
{
    public void CallServerSideCode()
    {
        HtmlDocument doc = ((Form1)Application.OpenForms[0]).webBrowser1.Document;
        string renderedHtml = doc.GetElementsByTagName("HTML")[0].OuterHtml;
        // here I sometimes get full html but sometimes the same as in webBrowser1_DocumentCompleted method
        List.Add(renderedHtml);
        ((Form1)Application.OpenForms[0]).Close();
    }
}

不行,我试过了。是的,我得到一些html,但不是在最终状态。如果您在我遇到问题的网站上尝试,您将看到WebClient中的html与您在浏览器中看到的“最终”html不同(在此上下文中,browser=IE,Chrome…)。在解释完所有JavaScript之后,您还想使用它吗?我刚刚尝试过,但不幸的是,它没有帮助。仅供参考:
private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
    if (webBrowser1.ReadyState == WebBrowserReadyState.Complete)
    {
        // Final html for 99% of web pages, but unfortunately not for all
        string tst = webBrowser1.Document.GetElementsByTagName("HTML")[0].OuterHtml;

        webBrowser1.DocumentCompleted -= new WebBrowserDocumentCompletedEventHandler(webBrowser1_DocumentCompleted);

        HtmlElement body = webBrowser1.Document.GetElementsByTagName("body")[0];
        HtmlElement scriptEl = webBrowser1.Document.CreateElement("script");
        IHTMLScriptElement element = (IHTMLScriptElement)scriptEl.DomElement;
        element.text = "$(function() { window.external.CallServerSideCode(); });";
        body.AppendChild(scriptEl);
    }
}

[ComVisible(true)]
public class MyScript
{
    public void CallServerSideCode()
    {
        HtmlDocument doc = ((Form1)Application.OpenForms[0]).webBrowser1.Document;
        string renderedHtml = doc.GetElementsByTagName("HTML")[0].OuterHtml;
        // here I sometimes get full html but sometimes the same as in webBrowser1_DocumentCompleted method
        List.Add(renderedHtml);
        ((Form1)Application.OpenForms[0]).Close();
    }
}