3

HTMLファイルを解析し、HTMLの特定の部分の数字を見つけたいです。このスクリプトの目的は、トークンごとに 1 つの数値を取得することです。このスクリプトは、正しい IP アドレスに属する番号を見つける必要があります。

数字は IP の一部ですが、IP は完全ではなく、html タグに分離されています。それは、この仕事が複雑であることです。今まで私はこのコードを持っています:

@echo off
Setlocal EnableDelayedExpansion
SET proxy_3=hide_2.htm         

FOR %%Z IN (hide_2.htm) DO (
FOR /F "tokens=1-20 delims=<>" %%A IN ('grep -B 1411 -E "</table>" %%Z ^| grep -E ^"^(display^|^^\d\d{1,3}^|country^|^<td^>HTTP^|rightborder^).*$^" ') DO (
echo A:%%A + B:%%B + C:%%C + D:%%D + %%E + %%F + %%G + %%H + %%I + %%J + %%K + %%L
FOR %%? in ( "%%~A", "%%~B", "%%~C", "%%~D", "%%~E", "%%~F", "%%~G", "%%~H", "%%~I", "%%~J") DO (
SET $=%%~?
echo $:!$!
)
pause
)
)

色付きのコードへのリンクをここに示します: http://codepaste.net/iaf4zr

次に、ここに私が解析したhtml ソースがあります: 行 581-585 を参照してください: http://codepaste.net/11bqxd (しばらくお待ちください。ロードまでに時間がかかります。しかし、待ちたくない場合のために、ここにソースを貼り付けます。フォーマットなしの html: http://codepaste.net/wdkcdr )

短縮版を見たい場合 - これは関連部分L.581-585 です: http://codepaste.net/e1t61n

今、私はいくつかのデバッグを行いました:

A:          + B:td + C:span + D:span + 41 + /span + span style="display: none;"
+ 111 + /span + div +  +
$:
$:td
$:span
$:span
$:41
$:/span
$:span style="display:
$:none
$:
$:111
$:/span
$:div
Press any key to continue...
A: style="display: none;" + B:190 + C:/div + D:span class="" style="" + . + /spa
n + span + 197 + /span + span +  +
$: style="display:
$:none
$:
$:190
$:/div
$:span class="" style=""
$:.
$:/span
$:span
$:197
$:/span
$:span
Press any key to continue...
A: style="display: none;" + B:24 + C:/span + D:span + /span + . + span style="di
splay:  +  +  +  +  +
$: style="display:
$:none
$:
$:24
$:/span
$:span
$:/span
$:.
$:span style="display:
$: "" "" "
Press any key to continue...
A:inline;" + B:132 + C:/span + D:span style="display: none;" + 39 + /span + . +
span  +  +  +  +
$:inline;"" "132" "/span" "span
$:style
$:display: none;"" "39" "/span" "." "span
$: "" "

ドル - $: は $ 変数の値をマークします。これは、引用符なしで 2 番目のループから派生した列/トークンである必要があります。ここでは、引用符なしで数値を探します。これは最後のケースでは失敗します。

文字 B: ... D: 最初の 4 つのトークン/列をマークし、残りのトークンはマークされません...

行 581-585 の該当/関連部分は次のとおりです。

A:inline;" + B:132 + C:/span + D:span style="display: none;" + 39 + /span + . +
span + + + +
$:inline;"" "132" "/span" "span
$:style
$:display: none;"" "39" "/span" "." "span
$: "" "

この部分を色で見たい場合は、次のリンクを参照してください: http://www.dostips.com/forum/viewtopic.php?f=3&t=3435

したがって、2 番目のループのトークン B は 132 で、引用符はありません。それは大丈夫に見えます。しかし、3 番目のループでは、 ... styleに変更されます。

2 番目のループの最初のトークンは inline;" ですが、3 番目のループはinline;"" "132" "/span" "spanを示しています

これがどのように可能か説明してもらえますか? 2人目のメンバーが入ったらそこの132が見たいです。最初の 3 つの数字は正常に解析できましたが、これはどうしようもありません。

4

1 に答える 1

1

あなたの問題は引用符の解析にあります。ラインが

FOR /F "tokens=1-20 delims=<>" %%A IN 

実行すると、変数の多くに1つ以上の二重引用符を含む値が割り当てられます。たとえば、ループを最初に通過するとき、Gは次と同等に割り当てられます。

(set G=span style="display: none;")

次に、内部ループで、

FOR %%? in ( "%%~A", "%%~B", "%%~C", "%%~D", "%%~E", "%%~F", "%%~G", "%%~H",...

「%%〜G」はに置き換えられます

"span style =" display:none; ""

これは2つのトークンとして解析されます。

"span style =" display:

無し;""

(なぜなら、=とdisplayの間の "は最初に"を終了するので、noneの前のスペースが重要になります)

同様に、問題が発生しているループの3回目では、A、B、C、およびDが同等に割り当てられます。

set A=inline;"
set B=132
set C=/span
set D=span style="display: none;"
set E=39
set F=/span
set G=.

さて、簡単に見逃されるのはHの値です。「A:...」出力行を注意深く調べると、Hが次と同等に設定されていることがわかります。

(set H=span )

また

set "H=span "

つまり、Hは文字列のスパンの後にスペースが続くため、内側のループになります。

FOR %%? in ( "%%~A", "%%~B", "%%~C", "%%~D", "%%~E", "%%~F", "%%~G", "%%~H", "%%~I", "%%~J")

と同等です(シェルは、%% varsの代わりに使用し、トークンを解析する前に、 "の末尾の"を削除します)

FOR %%? in ( "inline;"" "132" "/span" "span style="display: none;"" "39" "/span" "." "span " "" "" )

それがどのように解析されるかを注意深く見てください。"列をなして;" は文字列であり、 ""は文字列であり、埋め込まれたスペースはトークンセパレータとして扱われません。その後、まだスペースがない132が続きます。 ""も文字列であり、埋め込まれたスペースはトークンセパレータとして扱われず、その後に続きます。 / span and ""ここでも、埋め込まれたスペースはトークンセパレータとして扱われず、最後にスパンとスペースになるため、最初のトークンは次のようになります。

set ?="inline;"" "132" "/span" "span

次に、「for」構文解析の文書化されていない機能を取得します。引用符の外側の=はスペースのように扱われるため、2番目のトークンは次のようになります。

set ?=style

次に、3番目のトークンである「display:none;」から開始します。続いて""then 39 then "" then / span then""then。それから""そしてスパン、私たちが最終的に重要なスペースに遭遇したとき、

set ?="display: none;"" "39" "/span" "." "span

次に、最後のトークンは「」、「」、「未終了」の順になります。

set ?=" "" ""

要するに、あなたがする必要があるのは、適切な場所で引用符を取り除くことです。基本的に、問題は、最初のトークン%% Aに一致しない二重引用符が含まれており、Forループのテキスト行の解析が完全に台無しになっていることです。

于 2012-08-01T18:11:15.997 に答える