簡體   English   中英

在delphi中下載csv文件

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM