みんなに優しく、解りやすくをモットーに開設しています。 以下のルールを守りみんなで助け合いましょう。
1.ファイルメーカーで解らない事があればここで質問して下さい。 何方でも、ご質問・ご回答お願いします。 (優しく回答しましょう)
You are not logged in.
Pages: 1
HTLMの解析をしたいです。
<div> や <div class="Product__Info ">の範囲を
関数を使って抜き取りたいのですが
その中に何個も<div>があると抜き取れません。
どうすればいいでしょうか?><;
HTMLのツール(ブラウザについてます)を使うのがいいのでは。
省略可能な閉じタグなど不確定要素があるので、テキスト関数で取り出すのは、ほぼ無理だと思います。
JavaScriptでできるのかなあ。
ご返答ありがとうございます!
既にFilemakerにHTMLが入っていてFilemakerで処理をしたいと思っています。
省略可能な閉じタグがない場合でしたら可能でしょうか?
カスタム関数が理想ですが、難しければスクリプトでもいいです。
宜しくお願い致します。
https://fm-aid.com/bbs2/viewtopic.php?id=11630
の最後の方のカスタム関数でいけるでしょう。属性付きのタグがあるのなら、微調整は必要かもしれません
Last edited by Shin (2021-05-07 23:41:06)
Offline
Substitute関数を使った簡便な解法案をば!!
属性パラメータの有無に関わらず<div>タグの「outerHTML」を抜き出す式例。
(もちろん innerHTML のみも式の調整で可能です)
●例えば元のHTML文が、
<html>
<body>
<div>AAAA</div>
aaaaa
12345
<div class="Product__Info ">BBB</div>
<div>CCC</div>
zzzz123
<div id="item-001">001</div>
</body>
</html>
↓として
●その計算結果は、
<div>AAAA</div>
<div class="Product__Info ">BBB</div>
<div>CCC</div>
<div id="item-001">001</div>
++++++++++
Let([
#htm=Substitute(HTML文; ["""";""""""]);
#fnc=Substitute(
"Left(""" & #htm & """;0)"
; ["<div"; """;0) & ""<div"]
; ["</div>"; "</div>\¶"" & Left("""]
)
];
Evaluate(#fnc)
)
Offline
Hiroさんのは<div>が入れ子になってる場合に対応してないですよね。
Shinさんのカスタム関数は、このページのソースを対象に実験したら、6番目以降のdivを取得しようとすると変な結果になった。(ページの先頭から取り出す?)
確かにHTMLはタグ構造化言語だから、<div>タグの入れ子対策は避けられないことでしたネ!!
少し複雑になりますが、入れ子対応化した修正式例です。
(※解析<div>タグ数に限界数がありますが、このページのソースHTML(<div>:120個)で軽くテストして診ましたが、一応最大 310個 位までなら動作OKのようです。)
例えば元のHTML文が、
<html>
<body>
<div>AAAA01
<div>XXX
<div>YYY
<li>111</li>
<li>222</li>
<li>333</li>
</div>ZZZ
</div>AAA03</div>
aaaaa
12345
<div class="Product__Info ">BBB</div>
<div>CCC</div>
zzzz123
<div id="item-001">001</div>
</body>
</html>
↓の時
その計算結果は、(全ての<div>内を切り出す→<div>内の非<div>タグも全て書き出す!)
<div>AAAA01
<DIV>XXX
<DIV>YYY <li>111</li> <li>222</li> <li>333</li>
</DIV>
ZZZ
</DIV>
AAA03</div>
<div class="Product__Info ">BBB</div>
<div>CCC</div>
<div id="item-001">001</div>
その修正式(ループ再帰式で、解析<div>タグ数に限界数あり)です。
Let(
[
$htm=HTML文;
$i=0;
$fnc="Case($i=Max(0; PatternCount($htm;""<div"")-1); $htm;
Let([
$i=$i+1;
#flg=Position($htm;""</div>"";1;$i) > Position($htm;""<div"";1;$i+1);
$htm=Case(#flg; Replace($htm; Position($htm;""<div"";1;$i+1); 0; ""_""); $htm);
$htm=Case(#flg; Replace($htm; Position($htm;""</div"";1;$i); 0; ""_""); $htm)
]; Evaluate($fnc))
)"
];
Let(
[
#htm=Substitute(Evaluate($fnc); ["""";""""""]; ["_<div";"\¶ <DIV"];["_</div>";"\¶ </DIV>\¶ "]);
#fnc=Substitute("Left(""" & #htm & """;0)"; ["<div"; """;0) & ""<div"]; ["</div>"; "</div>\¶"" & Left("""])
];
Evaluate(#fnc)
)
)
Last edited by Hiro (2021-05-10 20:42:22)
Offline
このページのソースで検証しましたが、10個目までは正しく動いています。それ以降も見た目は正しいようですが。 見つからなかった時の処理が漏れていました。修正してあります。
Last edited by Shin (2021-05-12 10:37:00)
Offline
Pages: 1
[ Generated in 0.008 seconds, 9 queries executed - Memory usage: 523.88 KiB (Peak: 528.78 KiB) ]