1

使用 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 的任何想法。

4

1 回答 1

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 函数,无需遍历所有元素。

于 2012-11-09T16:56:38.667 回答