Webページから文字列を切り出すには?

解決


Ben  2007-11-13 23:09:41  No: 28397

1.URLを与えてFname(localfile)に保存し、
UrlDownloadToFile(nil, PChar(URL),PChar(Fname), 0, nil);

2.St(StringList)に読み込んで、pos関数で文字列'aaaaa'を含む行(m)を求めて、
St.LoadFromFile(Fname);
for i:=0 to ST.Count-1 do begin
  j:=pos('aaaaa',St[i]);
  if j>0 then begin m:=i;break;end;
end;

3.得ようとする文字列(Pstr)切り出して、Gt(StringList)に入れる。
k:=pos('</b>',St[m]);
Pstr:=midstr(St[m],k-6,6);
Gt.Add(Pstr);

上記1〜3を実行すると、若干の時間を要します。
どうすれば改善されますか?


KHE00221  2007-11-14 16:26:31  No: 28398

>上記1〜3を実行すると、若干の時間を要します。
>どうすれば改善されますか?

若干の時間の時間とはどれほどの時間を指していますか?

このプログラムでは1つの文字列しか切り取っていないようですが
それならばほとんど時間が掛かっていない筈です
(HTML 自体大きなテキストファイルではありませんし)

たとえば <img タグの src= に設定されているファイル名を全て取得する
とかの場合にはより時間が掛かるでしょうが・・・

一番時間が掛かるのは

1.URLを与えてFname(localfile)に保存し、
UrlDownloadToFile(nil, PChar(URL),PChar(Fname), 0, nil);

だと思いますが。


Fusa  2007-11-14 19:34:44  No: 28399

ダウンロードデータ(つまりHTMLファイル)
を、一度、ファイルに書き出すから時間がかかるのではないでしょうか。
…回線速度によるような気もしますが…

WinInetを使って、
ダウンロードしてメモリ上で文字列を取得するには
http://delfusa.main.jp/delfusafloor/opensource/delfusalibrary/20070828160200/WinInetUnit/WinInetUnit.pas.txt
このページの一番下を参考にしてください。

また、Indyを使う場合は下記方法で出来たと思います。
//Indyを使う方法
//IndyのVersionは9.0.14
procedure TForm1.Button4Click(Sender: TObject);
var
  SaveFileName, SaveURL: String;
  fs: TFileStream;
begin
  SaveURL := Edit1.Text;
  SaveFileName := StringReplace(SaveURL, 'http://',
                    ExtractFilePath(Application.ExeName), [rfIgnorecase]);
  SaveFileName := StringReplace(SaveFileName, '/', '\', [rfReplaceAll]);
    ForceDirectories( ExtractFileDir( SaveFileName ));
  ForceDirectories( ExtractFileDir( SaveFileName ));

  fs := TFileStream.Create(SaveFileName, fmCreate); try
  IdHTTP1.Get(SaveURL, fs);
  finally fs.Free; end;
  //別の取得方法として
  //IdHTTP1.Get(SaveURL)とすると
  //指定URLの内容が文字列で取得できる
end;


Ben  2007-11-14 20:12:58  No: 28400

過去ログでもFusaさんの
「WinInetを使ったHTTPでのファイルダウンロードについて」を見つけました↓
https://www.petitmonte.com/bbs/answers?question_id=2268
消化不良ですが、これを使えば改善できそうです。
KHE00221さん、Fusaさん、的確な御指摘と御教示をありがとうございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加