易语言没有用过,不过你要获取webbrowser的元素的href属性,不一定都能获取的到的,因为很多网站都屏蔽掉了,你可以尝试新开个webbrowser,在新的webbrowser去打开你那个链接,然后在DocumentComplete事件中获取到加载后的URL就是你链接的真实地址;
很简单在NewWindow事件里面捕获!
string url=WB1DocumentActiveElementGetAttribute("href"); //获取URL方法一
if(url=="")
url=WB1StatusText;//获取URL方法二
表单数据看HTML源码中的表单ID,然后通过
Set tb1 = WB1Documentgetelementbyid(tabledID) 来取得表单对象,
如果HTML源码中的表单没有ID,可以用For each来遍历找到所需的表单。
以下是从一个网页中的表格获取数据到MSGrid的代码,供参考:
Set tb1 = WB1Documentgetelementbyid("maintable")
'设置列头、列宽
For i = 0 To 11
MSH1ColWidth(i) = tb1Rows(0)cells(i)Width 15 15
MSH1TextMatrix(0, i) = tb1Rows(0)cells(i)innertext
Next
skip = 0
For Each crow In tb1Rows
If skip < 0 Then
skip = skip + 1
Else
rowstr = ""
If crowcells(0)innertext <> "序号" Then
For i = 0 To 11
tmp = crowcells(i)innertext
tmp = Replace(tmp, vbTab, " ")
rowstr = rowstr & tmp & vbTab
ReSizeCellHeight MSH1, MSH1Rows - 1, i
Next
MSH1AddItem rowstr
End If
End If
Next
在百度上找了很多方法,没有一个能够完美的解决这个问题。
我在XP SP3上测试,WebBrowser的OnNewWindow3事件中处理是无效的,不知道人家说XP SP2有效是怎么回事。
那种创建一个隐藏窗口出来的办法,我个人反正是不愿意去用,总之感觉不太好,而且据说这是目前唯一的解决办法。
后来实在没办法了,只能往土办法去想了,我们知道IE中有状态栏这个东西,当鼠标指向某个链接时,状态栏的文字就变成链接地址了。
经过测试之后,确实可以用WM_GETTEXT来获取到链接,这就解决了OnNewWindow2中获取不到新窗口的链接的问题了。
但是IE可以有状态栏,WebBrowser中我找了一下,没有发现能够显示状态栏的 *** 作,在spy++中查看,也不像IE那样有状态栏的窗口。所以,我又仔细研究了一下WebBrowser关于状态栏的事件。后来发现StatusTextChange中其实就可以直接获取到状态栏的文字了。
于是,写代码的事情就很简单了,而且是完美的解决问题,不管是js的 windowopen 还是一个简单的新窗口链接。
void CMWebDlg::OnNewWindow2Explorer1(LPDISPATCH FAR ppDisp, BOOL FAR Cancel)
{
VARIANT vars;
m_WebNavigate(strURL,NULL,NULL,&vars,&vars);
Cancel =TRUE;
}
void CMWebDlg::OnStatusTextChangeExplorer1(LPCTSTR Text)
{
strURL=Text;
}
在类中或者CPP中 CString strURL; 一下即可。
使用WebBrowser控件获取网页源码的方法,大多数的人都是使用以下的方法获取:
(WebBrowser1Document as IHtmlDocument2)bodyouterHtml;
这种方法的美中不足就是只能获取网页<body>与</body>之间的网页源码,而<body>之外如<head>部分的网页源码就获取不到了,下面是某大牛老师给大家分享的方法,可参考:
procedure TForm1Button1Click(Sender: TObject);
var
ole_index, oleObj: OleVariant;
i: integer;
begin
if WebBrowser1Busy then Exit; //网页加载中,退出。
Memo1LinesClear;
//获取主框架网址及网页源码
Memo1LinesAdd(WebBrowser1OleObjectdocumenturl);
Memo1LinesAdd(WebBrowser1OleObjectdocumentdocumentElementouterHTML);
Memo1LinesAdd(' '); Memo1LinesAdd(' '); //添加空行
//循环获取每一个子框架网址及网页源码
for i := 0 to WebBrowser1OleObjectdocumentframeslength - 1 do
begin
ole_index := i;
oleObj := WebBrowser1OleObjectdocumentframesitem(ole_index);
Memo1LinesAdd(oleObjdocumenturl);
Memo1LinesAdd(oleObjdocumentdocumentElementouterHtml);
Memo1LinesAdd(' '); Memo1LinesAdd(' '); //添加空行
end;
end;
WebBrowser webBrowser1;
private void button1_Click(object sender, EventArgs e)
{
webBrowser1Navigate(textBox1Text); //加载Url
}
private void Form1_Load(object sender, EventArgs e)
{
webBrowser1 = new WebBrowser();
}
这是一幅整图,由于太大,本人就截成三个小图了;
通过上图的详细的步骤说明,我们清楚的指导我们要怎么做了;我们切换到代码片段:
2:
这是本人的项目结构,在Common文件夹里面有一个显眼的文件GatherWebBrowsercs这是本人对WebBrowser控件进行了一层简单的封装,就是在里面加上了一些事件参数,这个文件下面有一个GatherWebBrowserArgscs文件,这个是WebBrowserDocumentCompletedEventArgs对象的配送对象;
3:
这个对象的目的就是将DocumentCompleted事件分离出来,让我们处理N层跳转的时候能很方便; 由于代码较多,我们就看几个关键的地方,能帮大家理清一个头绪就行了;
4:
这个是我们Winform窗口,WebBrowser控件就是我封装的那个控件,大家请注意,在我们层层跳转到最后的采集页面时,我们要将事件链中的第一个事件断开,为什么要断开,是因为我们的WebBrowser控件的DocumentCompleted事件总是会在网页加载完毕后触发,一旦当我们进入到采集生命周期中的时候,这部分的逻辑我们是不需要在处理的,这里就涉及到一个技术细节“委托链”,如果对这方面的东西不太了解的话,请查阅本人的“NET简谈委托链”一文;
由于数据采集逻辑比较复杂,特别是自动数据采集,需要处理很多逻辑问题,这些东西都是因需求不同而不同,所以本人也只能讲解到这个层度了,大概的实现方式都是这样的,只要我们去慢慢的分析前后关系,HTML的组织,我相信肯定能写出好的数据采集;在下面的一篇文章中我将要通过WebBrowser实现与网页交互的系统,这方面的需求也是我们经常碰到的,比如我们有一个C/S的系统,但是我们的C/S系统要依附于B/S的系统,需要将我们的C/S系统的数据作为B/S系统的 *** 作条件,在输入查询条件的时候,我们需要调用我们的Winform窗口,进行数据查询,然后将我们的Winform结果填到HTML的文本框中;请读者继续关注,谢谢;
以上就是关于怎么通过精易模块取WebBrowser中链接的href地址全部的内容,包括:怎么通过精易模块取WebBrowser中链接的href地址、c#webbrowswer1如何获取d出IE窗口的URL、通过 webbrowser 怎样获取网页数据等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)