Xpathで要素を取得する方法

55 views
Skip to first unread message

清水@Anthnet

unread,
Feb 6, 2025, 10:15:25 PMFeb 6
to Japan RAD Studio User Group
お世話になります。清水です。

web系に疎いので表現の仕方が怪しい箇所があるかとは思います
ご存知の方が居ましたら教えて下さい。

行いたいことは、Xpathで要素を取得したいです。

CEF4のTChromiumでアクセスしたHPのソースを取得
解析して値を取得になります。
要はスクレイピングになります。

ソースの文字列を地道に分解していけばできると思うのですが
他言語の開発ツールではXpathで要素を取得できることが書いてあったので
delphiでXpathにアクセスして要素を取得できる方法があれば教えて下さい。
よろしくお願いします。

Kenji ITO

unread,
Feb 7, 2025, 7:03:07 PMFeb 7
to radstu...@googlegroups.com
XpathでHTMLのスクレイピングを行うには対象サイトのHTMLがXML互換のXHTMLで書かれているのが前提となると思いますので、まず該当サイトのソースコードを https://scrapinghub.github.io/xpath-playground/ に入力して Xpath が使えるかどうかを確認した方が良いと思います。

Xpathが使えるようなら、 https://www.philo.de/xml/downloads.shtml で公開されている Adom が使えます。

PS. 余計なお世話かもしれませんが、対象サイトのスクレイピングが禁止されていないかは事前に確認されていますよね?
--
伊藤 賢治( myst...@gmail.com )


2025年2月7日(金) 12:15 清水@Anthnet <shimiz...@gmail.com>:
--
このメールは Google グループのグループ「Japan RAD Studio User Group」に登録しているユーザーに送られています。
このグループから退会し、グループからのメールの配信を停止するには radstudio-jp...@googlegroups.com にメールを送信してください。
このディスカッションを表示するには、https://groups.google.com/d/msgid/radstudio-jp/692b9efe-22f5-4fb6-9665-03d346494f92n%40googlegroups.com にアクセスしてください。

mam

unread,
Feb 8, 2025, 1:23:12 AMFeb 8
to Japan RAD Studio User Group
CEF4のTChromiumは知らないのですいません。

私はTEdgeBrowserやWebView4Delphiを使っています。
これらはJavascriptを使うことができるのでXPathを使わなくても例えばDelphiから
WVBrowser1.ExecuteScript('console.log(document.body.innerText);', 1);
とJavascriptを送り込むと実行され、現在のコンテンツのテキストだけを取り出した結果がログに出力されます。

ログが出力されると DevToolsProtocolEventReceived から出力ログを取り出せます。(コンテンツのテキストだけ取り出せます)
procedure TForm1.WVBrowser1DevToolsProtocolEventReceived(Sender: TObject;
  const aWebView: ICoreWebView2;
  const aArgs: ICoreWebView2DevToolsProtocolEventReceivedEventArgs;
  const aEventName: wvstring; aEventID: Integer);
var pwc:PChar;
    json1,json2:TJsonValue;
begin
  if aEventID=1 then
  begin
    //「コンソール」にメッセージが出力されたイベントが発生
    //Memo1.Lines.Add('■console.logイベントが発生');
    //イベント名"Console.messageAdded"が出力
    //Memo1.Lines.Add(aEventName);
    aArgs.Get_ParameterObjectAsJson(pwc);//jsonの値を取り出す
    //Memo1.Lines.Add(pwc);

    //jsonの値(message.text)を取り出す
    json1:=TJSONObject.ParseJSONValue(pwc);
    json2:=json1.GetValue('message');
    Memo1.Lines.Add(json2.GetValue('text'));
  end;
end;

同じようにCEF4のTChromiumでもJavascriptがDelphiから使えて出力結果を取り出せるのであれば、同じようにするのは如何でしょうか。


ご参考までTEdgeBrowserやWebView4Delphiの使い方の解説を以下URLに少しだけ作っています。
https://mam-mam.net/delphi/tedgebrowser.html
https://mam-mam.net/delphi/tedgebrowser_webview4delphi.html


とても外していたらすいません。



2025年2月8日土曜日 9:03:07 UTC+9 Kenji ITO:

mam

unread,
Feb 14, 2025, 10:21:21 AMFeb 14
to Japan RAD Studio User Group
TEdgeBrowserやWebView4Delphiを使うとクリックもプログラムからできますし、新しいウィンドウが開く場合にも対応可能です。

例えば以下は、id="myid" の要素をクリックします。
WVBrowser1.ExecuteScript('document.querySelector("#myid").click();', 1);

新しいウィンドウが開く場合には NewWindowRequested イベントが発生し、
URLが届きますので新しいWebViewを開くなりすれば複数ウィンドウに対応することも可能です。

procedure TForm1.WVBrowser1NewWindowRequested(Sender: TObject;
  const aWebView: ICoreWebView2;
  const aArgs: ICoreWebView2NewWindowRequestedEventArgs);
var pUri:PChar;
begin
  //<a target="_blank" rel="noreferrer">をクリックし、
  //新しいブラウザWindowを開こうとした場合
  //とりあえず、新しいブラウザウィンドウを開かせないようにキャンセルする
  aArgs.Set_Handled(-1);

  //キャンセルしない場合は別ウィンドウが開く
  //aArgs.Set_Handled(0);

  //新しいブラウザウィンドウの要求URLを取得する
  aArgs.Get_uri(pUri);
  showmessage(
    '新しいブラウザウィンドウを開こうとしました'+
    #13#10+pUri
  );
end;

ご参考まで。
2025年2月8日土曜日 15:23:12 UTC+9 mam:

mam

unread,
Mar 12, 2025, 8:35:14 AMMar 12
to Japan RAD Studio User Group
Delphi 12.1(Community Edition)でTEdgeBrowserを使ってタブブラウザを作成するソースコードを公開しました。
https://mam-mam.net/delphi/tedgebrowser_tab.html
a target="_blank" のタグをクリックした場合や、右クリックして「新しいウィンドウで開く」をクリックした場合にも、
新しいタブが生成されて表示するようになっています。
ご参考になれば幸いです。

2025年2月15日土曜日 0:21:21 UTC+9 mam:
Reply all
Reply to author
Forward
0 new messages