[英]downloading csv files in delphi
使用 Indy Clients (IdHTTP) 我可以下載 csv 文件,如果我通過使用以下代碼知道文件的實際網址,它可以完美運行( 原始代碼):
procedure TForm1.Button1Click(Sender: TObject);
var
Url, LocalFile: String;
Strm: TFileStream;
begin
Url := 'http://www.cvrda.org/boats/cvrda_handicap/cvrda_ratings_2009.csv';
LocalFile := 'C:\cvrda_ratings_2009.csv';
Strm := TFileStream.Create(LocalFile, fmCreate);
try
try
IdHTTP1.Get(Url, Strm);
finally
Strm.Free;
end;
except
DeleteFile(LocalFile);
raise;
end;
end;
http://www.cvrda.org/boats/cvrda_handicap/cvrda_handicap.htm是網站,如果我查看頁面源代碼,我會得到 href:"cvrda_ratings_2009.csv"。 好,易於。
但是從 Stackoverflow 看這個非 Delphi 例子, 例子在這里,網站在這里,如果我按下導出按鈕,我可以手動下載 csv 文件,但是要以編程方式下載文件,我如何獲取整個 url實際的csv文件? 我在任何地方都找不到。
所以我想我的問題是:有沒有辦法獲取在 TWebBrowser 中手動下載的任何 csv 文件的整個 url?
更新
我希望做的是以編程方式下載 csv 文件。 但我不知道 csv 文件的 url 是什么。 如果我在 TWebBrowser 中單擊下載按鈕來下載 csv 文件,則會出現一個彈出窗口。 然后我必須在彈出窗口中手動按“保存”。 我希望以編程方式做到這一點。 如果我知道url,我可以使用Indy,但是因為我不知道csv文件的url,我必須使用TWebBrowser。
update(12Nov2012)示例 2(此示例需要一個 Tbutton 和一個表單上的 TWebBrowser)
procedure TForm1.Button1Click(Sender: TObject);
var
ovLinks: OleVariant;
x:integer;
begin
WebBrowser1.navigate('http://financials.morningstar.com/income-statement/is.html?t=AAPL&ops=clear');
//wait for page to load
ovLinks := WebBrowser1.OleObject.Document.all.tags('A');
if ovLinks.Length > 0 then
begin
for x := 0 to ovLinks.Length-1 do
begin
if Pos('javascript:SRT_stocFund.Export()', ovLinks.Item(x).href) > 0 then
begin
ovLinks.Item(x).click;
Break;
end;
end;
end;
end;
Sam M 的回答幫助我理解了很多,它適用於許多網頁,但不是全部。 我不知道如何使它適用於上面的示例 2。在上面的示例中,我可以在以編程方式單擊“導出”按鈕后手動下載 csv 文件。 但是要在本例中以編程方式下載 csv 文件,我仍然需要 csv 文件的 url。 在這種情況下如何獲取 csv 文件的 url 的任何想法。
在 Web 瀏覽器獲取 HTML 文檔后,您需要遍歷鏈接標簽。 根據當前的頁面格式,您需要比較每個鏈接上的 innerText 以查看您想要哪個鏈接。 找到所需的鏈接標簽后,獲取 href 屬性。 如果網頁的修改方式使您正在查找的鏈接的 innerText 被運行該網站的人更改,這將不起作用。
procedure Parse;
var URL : string;
i: integer;
Document: variant;
begin
Document := WebBrowser.Document AS IHTMLDocument3;
for i := 0 to Document.Links.Length - 1 do begin
if Document.Links.Item(i).innerText = 'here' then begin
URL := Document.Links.Item(i).href;
Break;
end;
end;
end;
如果將來網頁開始使用標簽 ID 或標簽名稱,那就更容易了。 使用 getElementById 函數,則無需遍歷所有元素。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.