在delphi中下载csv文件

时间:2012-11-09 10:24:46

标签: delphi downloading twebbrowser

使用Indy客户端(IdHTTP)我可以下载csv文件,如果我通过使用以下代码知道文件的实际网址,这完全有效(original code):

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 example here看这个非Delphi示例,网站是here,如果我按下导出按钮,我可以手动下载csv文件,但是以programaticaly下载文件,我该怎么办获取实际csv文件的整个URL?我无法在任何地方找到它。

所以我想我的问题是: 有没有办法获取在TWebBrowser中手动下载的任何csv文件的整个URL?

更新

我希望做的是以编程方式下载csv文件。但我不知道csv文件的URL是什么。如果我在TWebBrowser中单击下载按钮以下载csv文件,则会出现一个弹出窗口。然后我必须在弹出窗口中手动按“保存”。我希望以编程方式执行此操作。如果我知道url,我可以使用Indy,但因为我不知道csv文件的url,所以我必须使用TWebBrowser。

更新(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.在上面的示例中,我可以在以编程方式单击'Export'按钮后手动下载csv文件。但是在这个例子中以编程方式下载csv文件,我仍然需要csv文件的url。关于如何在这种情况下获取csv文件的URL的任何想法。

1 个答案:

答案 0 :(得分:2)

在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函数,然后就不需要遍历所有元素。