Web浏览器控件不显示Html但显示网页

时间:2012-02-11 13:45:24

标签: c# visual-studio-2010 webbrowser-control html-frames

我使用webbrowser控件自动执行任务,网站使用框架显示页面。 我的问题是我到了一个点,我可以看到网页在webbrowser控件上正确加载,但是当它进入代码并且我看到html我什么也看不见。

我也在这里看过其他例子,但所有这些都没有返回所有的浏览器html。

使用此功能得到的结果:

                    HtmlWindow frame = webBrowser1.Document.Window.Frames[1];
                    string str = frame.Document.Body.OuterHtml;

只是:

带有 SRC 标签等属性的主框架标签,有什么方法可以处理这个吗?因为我可以看到网页完全加载为什么我看不到html?AS当我在互联网浏览器上这样做我确实看到页面源一旦加载为什么不在这里?

  

附加信息

页面上有两个框架:

我用这个如上:

HtmlWindow frame = webBrowser1.Document.Window.Frames [0];

        string str = frame.Document.Body.OuterHtml;

我得到了第一帧的正确HTMl,但对于第二帧,我只看到:

<FRAMESET frameSpacing=1 border=1 borderColor=#ffffff frameBorder=0 rows=29,*><FRAME title="Edit Search" marginHeight=0 src="http://web2.westlaw.com/result/dctopnavigation.aspx?rs=WLW12.01&amp;ss=CXT&amp;cnt=DOC&amp;fcl=True&amp;cfid=1&amp;method=TNC&amp;service=Search&amp;fn=_top&amp;sskey=CLID_SSSA49266105122&amp;db=AK-CS&amp;fmqv=s&amp;srch=TRUE&amp;origin=Search&amp;vr=2.0&amp;cxt=RL&amp;rlt=CLID_QRYRLT803076105122&amp;query=%22LAND+USE%22&amp;mt=Westlaw&amp;rlti=1&amp;n=1&amp;rp=%2fsearch%2fdefault.wl&amp;rltdb=CLID_DB72585895122&amp;eq=search&amp;scxt=WL&amp;sv=Split" frameBorder=0 name=TopNav marginWidth=0 scrolling=no><FRAME title="Main Document" marginHeight=0 src="http://web2.westlaw.com/result/dccontent.aspx?rs=WLW12.01&amp;ss=CXT&amp;cnt=DOC&amp;fcl=True&amp;cfid=1&amp;method=TNC&amp;service=Search&amp;fn=_top&amp;sskey=CLID_SSSA49266105122&amp;db=AK-CS&amp;fmqv=s&amp;srch=TRUE&amp;origin=Search&amp;vr=2.0&amp;cxt=RL&amp;rlt=CLID_QRYRLT803076105122&amp;query=%22LAND+USE%22&amp;mt=Westlaw&amp;rlti=1&amp;n=1&amp;rp=%2fsearch%2fdefault.wl&amp;rltdb=CLID_DB72585895122&amp;eq=search&amp;scxt=WL&amp;sv=Split" frameBorder=0 borderColor=#ffffff name=content marginWidth=0><NOFRAMES></NOFRAMES></FRAMESET>
  

更新

框架的两个网址如下:

Frame1,其中我看到了

http://web2.westlaw.com/nav/NavBar.aspx?RS=WLW12.01&VR=2.0&SV=Split&FN=_top&MT=Westlaw&MST=

Frame2的html我看不到:

http://web2.westlaw.com/result/result.aspx?RP=/Search/default.wl&action=Search&CFID=1&DB=AK%2DCS&EQ=search&fmqv=s&Method=TNC&origin=Search&Query=%22LAND+USE%22&RLT=CLID%5FQRYRLT302424536122&RLTDB=CLID%5FDB6558157526122&Service=Search&SRCH=TRUE&SSKey=CLID%5FSSSA648523536122&RS=WLW12.01&VR=2.0&SV=Split&FN=_top&MT=Westlaw&MST=

第二帧的属性我的html没有得到如下图所示:

enter image description here

谢谢

4 个答案:

答案 0 :(得分:0)

为了获取HTML,你必须这样做:

        WebClient client = new WebClient();
        string html = client.DownloadString(@"http://stackoverflow.com");

这是一个例子当然,你可以改变地址。 顺便说一句,您需要使用System.Net;

答案 1 :(得分:0)

这很好用......获取所有内部元素的BODY元素:

表单代码中的某处:

wb.Url = new Uri("http://stackoverflow.com");
wb.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(wbDocumentCompleted);

这是wbDocumentCompleted:

void wb1DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
    var yourBodyHtml = wb.Document.Body.OuterHtml;
}

wb是System.Windows.Forms.WebBrowser

更新:

与文档相同,我认为您检查其内容时未加载第二帧...您可以尝试this链接中的解决方案。您必须等待加载帧才能查看其内容。

答案 2 :(得分:0)

最可能的原因是帧索引0与主/父页面具有相同的域名,而帧索引1具有不同的域名。我是对的吗?

这会产生一个跨框架的安全问题,WB控件只会让你高低干燥,并且不会告诉你究竟出了什么问题,只是让你的对象,属性和数据空了(会说“没有变量”) “当您尝试展开对象时,在观察窗口中。”

在这种情况下,您唯一可以访问的是URL和iFrame属性,但iFrame中没有任何内容。

当然,有一些方法可以克服跨框架安全问题 - 但它们不是内置在WebBrowser控件中,而是外部解决方案,具体取决于您使用的WB控件(如.NET版本或预.NET版本。)

如果我已正确识别您的问题,请告诉我,如果是,请您告诉您有关适合您的设置和解决方案的解决方案。 WB控件的实例。

UPDATE :我注意到你正在做.getElementByTagName(“HTML”)(0).outerHTML来获取HTML,你需要做的就是在文档对象上调用它,或.body对象,应该这样做。 MyDoc.Body.innerHTML应该获得你想要的内容。另外,请注意这些文档中还有其他iFrame,如果相关的话。你能给我们提供包含这两个URL的主文档URL吗?这样我们/我可以复制你在这里做的事情吗?另外,不确定为什么要使用DomElement,但是你应该将它强制转换为它想要转换的本机对象,IHTMLDocument2或你在watch窗口中看到的对象,我认为是IHTMLFrameElement(如果我没记错的话,但是一旦你看到它就会知道我的意思。如果您正在尝试使用XML对象,这可能是您无法获取HTML内容,更改对象声明和转换(如果有)的原因,并且可以使用它。让我们知道:)。现在我也很好奇:)。

答案 3 :(得分:0)

我支付了上述问题的解决方案并且100%有效。

我所做的是使用下面的这个功能,它将计数返回给我正在寻找的标签,我找不到:S ..用它来调用下面列出的函数:

FillFrame(webBrowser1.Document.Window.Frames);



private void FillFrame(HtmlWindowCollection hwc)
        {


            if (hwc == null) return;
            foreach (HtmlWindow hw in hwc)
            {
                HtmlElement getSpanid = hw.Document.GetElementById("mDisplayCiteList_ctl00_mResultCountLabel");
                if (getSpanid != null)
                {

                    doccount = getSpanid.InnerText.Replace("Documents", "").Replace("Document", "").Trim();

                    break;
                }

                if (hw.Frames.Count > 0) FillFrame(hw.Frames);
            }


        }

希望它有助于人们。

谢谢