使用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的任何想法。
答案 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函数,然后就不需要遍历所有元素。