五千年(敝帚自珍)

主题:【求助】WebBrowser的问题 -- 龙驹坝

共:💬8 🌺10 新:
全看树展主题 · 分页
家园 【求助】WebBrowser的问题

写了段WebBrowser代码,准备下载点数据。基本代码如下,问题出在保存部分,2010-01-01以后,内容不全。如果用ShowSaveAsDialog,每次都要确认,跟手工没区别。Document.ExeCommand("SaveAs",false,"..")的false参数无效,每次都要弹出那个对话框来。

那位有什么办法没有?

//初始化
WebBrowser webBrowser = new WebBrowser();
 webBrowser.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(Deleme);
 webBrowser.Navigate(new Uri("http://www.ctgpc.com.cn/inc/sqsk.php"));
//处理
HtmlElementCollection tagsCollection = webBrowser.Document.GetElementsByTagName("input");
 foreach (HtmlElement currentTag in tagsCollection)
 {
 if (currentTag.GetAttribute("name").Equals("NeedCompleteTime2"))
 {
 currentTag.SetAttribute("value", strDate);
 break;
 }
 }
 HtmlElementCollection col = webBrowser.Document.GetElementsByTagName("img");
 foreach (HtmlElement element in col)
 {
 string strAtt=element.GetAttribute("src");
 if (strAtt.IndexOf(@"/images/search2.jpg") != -1)
 {
 element.InvokeMember("onclick");
 break;
 }
 }
 m_dt_delme = m_dt_delme.AddDays(1) ;
//问题出在保存部分
writer.Writer(webBrowser.Document.Body.InnerHtml)
家园 微软表示不可以……

MSDN上说

This parameter is ignored. The Save HTML Document dialog box is always displayed……

如果是那个三峡数据,日期POST到服务端,用脚本+CURL来下载三峡数据吧。

curl is a command line tool for transferring data with URL syntax, supporting DICT, FILE, FTP, FTPS, GOPHER, HTTP, HTTPS, IMAP, IMAPS, LDAP, LDAPS, POP3, POP3S, RTMP, RTSP, SCP, SFTP, SMTP, SMTPS, TELNET and TFTP. curl supports SSL certificates, HTTP POST, HTTP PUT, FTP uploading, HTTP form based upload, proxies, cookies, user+password authentication (Basic, Digest, NTLM, Negotiate, kerberos...), file transfer resume, proxy tunneling and a busload of other useful tricks.

家园 是用C++吗?可以变通一下吗

弹确认框还弹,但是可以用FindWindowEx(或者类似的一个函数),找到弹框的窗口句柄,再找到确认按钮的窗口句柄,给这个窗口句柄发一个\D的WM_CHAR自动按下去就可以了

或者,这个WebBrowser我在Delphi里用的时候,有一个方法可以直接保存成文本形式的,那个不需要确认,以前做西西河浏览器,我就用过,不过是Delphi封装了一遍。

如果保存成文本可以,我就去找找代码发给你

家园 可以用普通文件IO

//问题出在保存部分

writer.Writer(webBrowser.Document.Body.InnerHtml)

你这个writer是什么?应当没有必要用WebBrowser自己的writer。write部分的代码应该是这样:

wchar_t *pText = webBrowser.Document.Body.InnerHtml;
int fileHandle = open("...",O_CREAT|O_TRUNC|O_BINARY,S_IREAD|S_IWRITE);
write(fileHandle,pText,wcslen(pText)*sizeof(wchar_t));
SysFreeString(pText);

如果还不行的话,看看用InnerText行不,不过这样就丢掉了所有格式。我用过InnerText,肯定是可以的。

家园 问题在于

InnerHtml的内容不全:只有半截,内容丢了大半。

家园 这个不应该呀

我刚试验了以下代码,没有问题:

 _di_IDispatch pDispDoc = Browser->Document;
 TComPtr<IHTMLDocument2> pDoc;
 if(pDispDoc->QueryInterface(IID_IHTMLDocument2,(void **)&pDoc)!=S_OK)
 {
 return;
 }
 TComPtr<IHTMLElement> pBody;
 if(pDoc->get_body(&pBody)!=S_OK)
 {
 return;
 }
 wchar_t *pText = NULL;
 if(pBody->get_innerHTML(&pText)!=S_OK)
 {
 return;
 }
 //use pText
 SysFreeString(pText);

获得的HTML代码是<body>到</body>之间的所有数据。数据是全的,没有问题。代码是在事件DocumentComplete里面用的。

家园 我看看怎么转换成c#代码。。。。。
家园 这种方法我已经很多年没有用了

想不到现在还要捡起来。。。有效还是有效的。

全看树展主题 · 分页


有趣有益,互惠互利;开阔视野,博采众长。
虚拟的网络,真实的人。天南地北客,相逢皆朋友

Copyright © cchere 西西河