如何在搜尋網頁上輸入條件後取得結果 |
尚未結案
|
senix
一般會員 發表:28 回覆:25 積分:10 註冊:2002-03-15 發送簡訊給我 |
請教各位前輩~
假設把一搜尋網頁傳入WebBrowser物件後,
1.如何把搜尋條件自動傳入該網頁並且執行,
最後取得結果在傳回WebBrowser物件??
2.如果結果有分頁的狀況,又該如何把資料取出? (我只會取單頁資料^^)
3.原始碼Compile沒錯,但執行到
Edits :=WebBrowser1.OleObject.Document.all.Item('Yr', 0);
就出現 Access violation...的錯誤訊息
附上原始碼,請幫忙看看,謝謝指點^_~ uses SHDocVw, MSHTML procedure TBDP708F.Label1Click(Sender: TObject);
var
Docs, Edits : OleVariant;
str_Year,str_Month,str_Day:string;
Flags: OLEVariant;
begin
str_Year :=InttoStr(StrtoInt(Copy(edtFinishDate.text,1,4))-1911);
str_Month:=Copy(edtFinishDate.text,6,2);
str_Day :=Copy(edtFinishDate.text,9,2);
Docs :=WebBrowser1.Document;
Flags:=0;
//傳入搜尋網頁
WebBrowser1.Navigate(WideString
('http://otcbnd.gretai.org.tw/c/d09.asp'),
Flags, Flags, Flags, Flags);
while strOK1='' do // 還未執行完成時
begin
Application.ProcessMessages;
end;
//傳入搜尋條件 民國___年___月___日
Edits :=WebBrowser1.OleObject.Document.all.Item('Yr', 0);
Edits.Value :=str_Year;
Edits :=WebBrowser1.OleObject.Document.all.Item('Mon', 0);
Edits.Value :=str_Month;
Edits :=WebBrowser1.OleObject.Document.all.Item('Day', 0);
Edits.Value :=str_Day;
//執行搜尋網頁http://otcbnd.gretai.org.tw/c/d09.asp
WebBrowser1.OleObject.Document.GetElementByID('btnsubmit').Click;
//取得結果 http://otcbnd.gretai.org.tw/c/d09show.asp~~略
//==此結果可能會分頁==
end;
| ||
qoo1234
版主 發表:256 回覆:1167 積分:659 註冊:2003-02-24 發送簡訊給我 |
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls, OleCtrls, SHDocVw_TLB, EmbeddedWB; type TForm1 = class(TForm) WebBrowser1: TEmbeddedWB; Panel1: TPanel; Button1: TButton; Button2: TButton; Edit1: TEdit; Edit2: TEdit; Edit3: TEdit; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation uses MSHtml; {$R *.dfm} function FillForm(WebBrowser: TWebBrowser; FieldName: string; Value: string): Boolean; var i, j: Integer; FormItem: Variant; begin Result := False; if WebBrowser.OleObject.Document.all.tags('FORM').Length = 0 then begin Exit; end; for I := 0 to WebBrowser.OleObject.Document.forms.Length - 1 do begin FormItem := WebBrowser.OleObject.Document.forms.Item(I); for j := 0 to FormItem.Length - 1 do begin try if FormItem.Item(j).Name = FieldName then begin FormItem.Item(j).Value := Value; Result := True; end; except Exit; end; end; end; end; procedure TForm1.Button1Click(Sender: TObject); begin WebBrowser1.Navigate('http://otcbnd.gretai.org.tw/c/d09.asp'); end; procedure TForm1.Button2Click(Sender: TObject); var hd:IHtmlDocument2; f: IHTMLFormElement; begin FillForm(WebBrowser1,'Yr',Edit1.Text); FillForm(WebBrowser1,'Mon',Edit2.Text); FillForm(WebBrowser1,'Day',Edit3.Text); hd := WebBrowser1.Document as IHtmlDocument2; f := hd.forms.item(0, 0) as IHTMLFormElement; f.submit; end; end.網海無涯,唯學是岸! |
||
qoo1234
版主 發表:256 回覆:1167 積分:659 註冊:2003-02-24 發送簡訊給我 |
2.如果結果有分頁的狀況,又該如何把資料取出? (我只會取單頁資料^^)
procedure TForm1.Button3Click(Sender: TObject); var Document : IHtmlDocument2; Link : IHTMLElement; StrLinks : string; Target,Nothing: OleVariant; i : integer; begin StrLinks:=''; Target := '_self'; Nothing := ''; Document := WebBrowser1.Document as IHTMlDocument2; for i := 0 to Document.Links.Length - 1 do begin Link := Document.Links.Item(i, 0) as IHTMLElement; StrLinks := Link.ToString; if StrLinks<>''then WebBrowser1.Navigate(StrLinks, Nothing, Target, Nothing, Nothing) else showmessage('這是最後一頁'); end; end;網海無涯,唯學是岸! 發表人 - qoo1234 於 2004/07/23 00:15:40 |
||
senix
一般會員 發表:28 回覆:25 積分:10 註冊:2002-03-15 發送簡訊給我 |
謝謝qoo1234前輩的指點,但是按照範例
會找不到SHDocVw_TLB, EmbeddedWB???我有use喔^^ 如果依原始碼加以修改,即可完成取回結果的功能,
but傳回的網頁都停在最後一頁(約三頁),而且轉入memo的資料
都是只有...只有第二頁,請問是哪出了問題?
可以依頁序轉入memo嗎?? ===再次附上原始碼===
uses SHDocVw, MSHTML procedure TBDP708F.btnImportClick(Sender: TObject);
var
Docs, Edits : OleVariant;
str_Year,str_Month,str_Day:string;
Flags: OLEVariant;
begin
str_Year :=InttoStr(StrtoInt(Copy(edtFinishDate.text,1,4))-1911);
str_Month:=Copy(edtFinishDate.text,6,2);
str_Day :=Copy(edtFinishDate.text,9,2);
Docs :=WebBrowser1.Document;
Flags:=0;
//傳入搜尋網頁
WebBrowser1.Navigate(WideString
('http://otcbnd.gretai.org.tw/c/d09.asp'),
Flags, Flags, Flags, Flags);
while strOK1='' do // 還未執行完成時
begin
Application.ProcessMessages;
end;
//傳入搜尋條件 民國___年___月___日
Edits :=WebBrowser1.OleObject.Document.all.Item('Yr', 0);
Edits.Value :=str_Year;
Edits :=WebBrowser1.OleObject.Document.all.Item('Mon', 0);
Edits.Value :=str_Month;
Edits :=WebBrowser1.OleObject.Document.all.Item('Day', 0);
Edits.Value :=str_Day; //執行搜尋網頁http://otcbnd.gretai.org.tw/c/d09.asp
WebBrowser1.OleObject.Document.GetElementByID('btnsubmit').Click;
Get_FinishRate;
//取得結果 http://otcbnd.gretai.org.tw/c/d09show.asp
//==此結果可能會分頁==
end; procedure TBDP708F.Get_FinishRate;
var
hd: IHTMLDocument2; //uses MSHTML;
intRow,intLength,intCont:integer;
begin
//Memo1.Clear;
meoResoult.Clear;
strOK1:='';
strOK2:='';
Flags:=0;
WebBrowser1.Navigate(WideString
('http://otcbnd.gretai.org.tw/c/d09show.asp'),
Flags, Flags, Flags, Flags);
while strOK1='' do // 還未執行完成時
begin
Application.ProcessMessages;
end;
HD := WebBrowser1.Document as IHTMLDocument2;
Memo1.Text := HD.body.innerText;
//WebBrowser1.Refresh;
end; procedure TBDP708F.WebBrowser1DocumentComplete(Sender: TObject;
const pDisp: IDispatch; var URL: OleVariant);
begin
strOK1 := 'OK';
end;
|
||
qoo1234
版主 發表:256 回覆:1167 積分:659 註冊:2003-02-24 發送簡訊給我 |
|||
qoo1234
版主 發表:256 回覆:1167 積分:659 註冊:2003-02-24 發送簡訊給我 |
僅供參考,有時間在測試!
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ComCtrls, OleCtrls, SHDocVw_TLB, EmbeddedWB, ExtCtrls, Grids; type TForm1 = class(TForm) GroupBox1: TGroupBox; Label1: TLabel; Label2: TLabel; Label3: TLabel; Label4: TLabel; Edit1: TEdit; Edit2: TEdit; Edit3: TEdit; Button1: TButton; Button2: TButton; StringGrid1: TStringGrid; Edit4: TEdit; Panel1: TPanel; WebBrowser1: TEmbeddedWB; RichEdit1: TRichEdit; Button3: TButton; Splitter1: TSplitter; Button4: TButton; Button5: TButton; Memo1: TMemo; //測試用 Button6: TButton; procedure Button2Click(Sender: TObject); procedure Button1Click(Sender: TObject); procedure Button3Click(Sender: TObject); procedure Button4Click(Sender: TObject); procedure Button5Click(Sender: TObject); procedure Button6Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation uses MSHtml,ActiveX; {$R *.dfm} function FillForm(WebBrowser: TEmbeddedWB; FieldName: string; Value: string): Boolean; var i, j: Integer; FormItem: Variant; begin Result := False; if WebBrowser.OleObject.Document.all.tags('FORM').Length = 0 then begin Exit; end; for I := 0 to WebBrowser.OleObject.Document.forms.Length - 1 do begin FormItem := WebBrowser.OleObject.Document.forms.Item(I); for j := 0 to FormItem.Length - 1 do begin try if FormItem.Item(j).Name = FieldName then begin FormItem.Item(j).Value := Value; Result := True; end; except Exit; end; end; end; end; Procedure IsolateTextBetweentags( Const S: String; Tag1, Tag2: String; list:TStrings ); Var pScan, pEnd, pTag1, pTag2: PChar; foundText: String; searchtext: String; begin searchtext := Uppercase(S); Tag1:= Uppercase( Tag1 ); Tag2:= Uppercase( Tag2 ); pTag1:= PChar(Tag1); pTag2:= PChar(Tag2); pScan:= PChar(searchtext); Repeat pScan:= StrPos( pScan, pTag1 ); If pScan <> Nil Then begin Inc(pScan, Length( Tag1 )); pEnd := StrPos( pScan, pTag2 ); If pEnd <> Nil Then begin SetString( foundText, Pchar(S) + (pScan- PChar(searchtext) ), pEnd-pScan ); list.Add( foundText ); pScan := pEnd + Length(tag2); end else pScan := Nil; end; Until pScan = Nil; end; procedure TForm1.Button2Click(Sender: TObject); begin WebBrowser1.Navigate('http://otcbnd.gretai.org.tw/c/d09.asp'); end; procedure TForm1.Button1Click(Sender: TObject); var hd:IHtmlDocument2; f: IHTMLFormElement; begin FillForm(WebBrowser1,'Yr',Edit1.Text); FillForm(WebBrowser1,'Mon',Edit2.Text); FillForm(WebBrowser1,'Day',Edit3.Text); hd := WebBrowser1.Document as IHtmlDocument2; f := hd.forms.item(0, 0) as IHTMLFormElement; f.submit; end; procedure TForm1.Button3Click(Sender: TObject); var Document : IHtmlDocument2; Link : IHTMLElement; StrLinks : string; Target,Nothing: OleVariant; i : integer; begin StrLinks:=''; Target := '_self'; Nothing := ''; Document := WebBrowser1.Document as IHTMlDocument2; for i := 0 to Document.Links.Length - 1 do begin Link := Document.Links.Item(i, 0) as IHTMLElement; StrLinks := Link.ToString; if StrLinks<>''then WebBrowser1.Navigate(StrLinks, Nothing, Target, Nothing, Nothing) else showmessage('這是最後一頁'); end; end; procedure TForm1.Button4Click(Sender: TObject); var AStream:TMemoryStream; begin Memo1.Clear; AStream:=TMemoryStream.Create; try (WebBrowser1.Document as IPersistStreamInit).Save(TStreamAdapter.Create(AStream),false); AStream.Seek(0,soFromBeginning); RichEdit1.Lines.LoadFromStream(AStream); finally AStream.Free; end; IsolateTextBetweenTags(Richedit1.text,'網海無涯,唯學是岸! 發表人 - qoo1234 於 2004/07/24 03:30:01 |
||
senix
一般會員 發表:28 回覆:25 積分:10 註冊:2002-03-15 發送簡訊給我 |
|||
I_Love_You
一般會員 發表:18 回覆:87 積分:21 註冊:2002-07-24 發送簡訊給我 |
qoo1234大大,以及各位高手们,请帮帮小弟,看看问题出在什么地方,
都快郁闷死我了,摆脱了,谢谢!!! 我也是想对一个网页进行自动输入,然后执行某个网页中的按钮,最后将
查询的结果再另存为一个文本的格式。但我在第一步的自动输入的部分就
遇到问题了。我的这个网页是由3个frames组成的(我测试过,如果是一个
frame就没有问题的),请看:http://sc.hkex.com.hk/gb/www.hkex.com.hk/invest/index_c.asp?id=company/quotemenu_page_c.asp
当我找到相应的输入文本框以后,并输入数据,但在文本框上却没有显示
数据,不知道这是为什么呢?下面是我的原代码,请看一下: procedure TMain_Frm.Button1Click(Sender: TObject);
begin
WebBrowser1.Navigate('http://sc.hkex.com.hk/gb/www.hkex.com.hk/invest/index_c.asp?id=company/quotemenu_page_c.asp');
end; procedure TMain_Frm.Button2Click(Sender: TObject);
var
Document : IHtmlDocument2;
Edits,ole_index : OleVariant;
frame_dispatch: IDispatch;
frame_win: IHTMLWindow2;
frame_doc: IHTMLDocument2;
begin
document := WebBrowser1.Document as IHTMLDocument2;
ole_index := 2;
frame_dispatch := document.Frames.Item(ole_index);
if frame_dispatch <> nil then
begin
frame_win := frame_dispatch as IHTMLWindow2;
frame_doc := frame_win.document; Edits :=frame_doc.all.Item('WidCoID', 0);
Edits.Value:='5';
end;
end; (我想要的很简单,就是打开这个网页后,在“今日股价”下面的“代码”
的地方自动输入数字,例如:‘5’等,然后,自动再执行“去”按钮,
最后将查询到结果,再自动存储到一个文本中就可以了。 可我在第一步自动输入数字这部分就卡住了,请各位大大帮忙看看怎么回
事,万分感谢!!!!!!!!!)
|
||
I_Love_You
一般會員 發表:18 回覆:87 積分:21 註冊:2002-07-24 發送簡訊給我 |
qoo1234大大,以及各位高手们,请帮帮小弟,看看问题出在什么地方,
都快郁闷死我了,摆脱了,谢谢!!! 我也是想对一个网页进行自动输入,然后执行某个网页中的按钮,最后将
查询的结果再另存为一个文本的格式。但我在第一步的自动输入的部分就
遇到问题了。我的这个网页是由3个frames组成的(我测试过,如果是一个
frame就没有问题的),请看:
www.hkex.com.hk/invest/index_c.asp?id=company/quotemenu_page_c.asp 当我找到相应的输入文本框以后,并输入数据,但在文本框上却没有显示
数据,不知道这是为什么呢?下面是我的原代码,请看一下: procedure TMain_Frm.Button1Click(Sender: TObject);
begin
WebBrowser1.Navigate('www.hkex.com.hk/invest/index_c.asp?id=company/quotemenu_page_c.asp');
end; procedure TMain_Frm.Button2Click(Sender: TObject);
var
Document : IHtmlDocument2;
Edits,ole_index : OleVariant;
frame_dispatch: IDispatch;
frame_win: IHTMLWindow2;
frame_doc: IHTMLDocument2;
begin
document := WebBrowser1.Document as IHTMLDocument2;
ole_index := 2;
frame_dispatch := document.Frames.Item(ole_index);
if frame_dispatch <> nil then
begin
frame_win := frame_dispatch as IHTMLWindow2;
frame_doc := frame_win.document; Edits :=frame_doc.all.Item('WidCoID', 0);
Edits.Value:='5';
end;
end; (我想要的很简单,就是打开这个网页后,在“今日股价”下面的“代码”
的地方自动输入数字,例如:‘5’等,然后,自动再执行“去”按钮,
最后将查询到结果,再自动存储到一个文本中就可以了。 可我在第一步自动输入数字这部分就卡住了,请各位大大帮忙看看怎么回
事,万分感谢!!!!!!!!!)
|
||
I_Love_You
一般會員 發表:18 回覆:87 積分:21 註冊:2002-07-24 發送簡訊給我 |
|||
I_Love_You
一般會員 發表:18 回覆:87 積分:21 註冊:2002-07-24 發送簡訊給我 |
|||
I_Love_You
一般會員 發表:18 回覆:87 積分:21 註冊:2002-07-24 發送簡訊給我 |
我的问题解决了,刚才不断看资料,不断测试,自动输入和自动按钮
已经搞定,这里我要说的就是: 首先感谢qoo1234大大提供的范例; 其次就是下面网站的资料:
http://www.cryer.co.uk/brian/delphi/twebbrowser/twebbrowser_oleobject.htm 还有一个重要原因,记得一定要安装MSHTML.lib,我就因为这个所以
才遇到问题的。 下面是我的原代码:
for I := 0 to WebBrowser1.OleObject.Document.Frames.Item(2).Document.all.tags('form').Length - 1 do
begin
FormItem := WebBrowser1.OleObject.Document.Frames.Item(2).Document.forms.Item(I);
for J := 0 to FormItem.Length - 1 do
begin
try
if FormItem.Item(J).Name = 'WidCoID' then
begin
FormItem.Item(J).Value := '5';
end;
if FormItem.Item(J).Type = 'button' then
begin
FormItem.Item(J).Onclick;
end;
except
Exit;
end;
end;
end;
|
||
Ktop_Robot
站務副站長 發表:0 回覆:3511 積分:0 註冊:2007-04-17 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |