For loop 解析html文件

For loop 解析html文件,for-loop,batch-file,cmd,For Loop,Batch File,Cmd,我想解析html文件并在html的某些部分查找数字。此脚本的目标是每个令牌获得一个数字。此脚本必须找到属于正确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 del

我想解析html文件并在html的某些部分查找数字。此脚本的目标是每个令牌获得一个数字。此脚本必须找到属于正确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
)
)
美元-$:标记$variable的值,它应该是第二个循环中不带引号的派生列/标记。在这里,我寻找没有引号的数值。这在最后一个案例中失败了

字符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
$: "" "
如果您想以颜色查看此部分,请查看此链接:

所以第二个循环中的标记B是132,没有引号。看起来不错。但在第三个循环中,它变为样式

而第二个循环中的第一个令牌是内联的;,第三个循环显示:inline;“132”“/span”


你能解释一下这是怎么可能的吗?我希望第二位成员收到时能看到。我可以成功解析前3个数字,但这是我帮不上忙的。

您的问题在于引号的解析。排队的时候

FOR /F "tokens=1-20 delims=<>" %%A IN 
然后在内部循环中

FOR %%? in ( "%%~A", "%%~B", "%%~C", "%%~D", "%%~E", "%%~F", "%%~G", "%%~H",...
“%%~G”替换为

“span style=“显示:无;“”

这将被解析为两个标记:

“span style=“显示:

没有;“”

(因为“between=和display”在开始时终止,所以none之前的空格变为有效)

类似地,在第三次循环中,也就是您遇到问题的地方,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 G=span style="display: none;")
(set H=span )

i、 e.H是字符串跨度,后跟一个空格,所以现在是内部循环

FOR %%? in ( "%%~A", "%%~B", "%%~C", "%%~D", "%%~E", "%%~F", "%%~G", "%%~H", "%%~I", "%%~J")
相当于(shell删除,在替换%%vars和解析令牌之前,在后面加上“)

仔细看看它是如何解析的;是字符串,则“”是字符串,嵌入的空间不被视为令牌分隔符,后跟132(还没有空格),“”也是字符串,嵌入的空间不被视为令牌分隔符,后跟/span和其中嵌入的空间再次不被视为令牌分隔符,然后最后是span和空间,因此第一个令牌成为

set ?="inline;"" "132" "/span" "span
接下来,我们将获得“for”解析的一个未记录的特性:引号外的an=被视为一个空格,因此第二个标记是

set ?=style
然后是第三个标记,从“display:none;”开始,然后是“39”然后是“然后是/span然后是”。然后“”然后span,当我们最终遇到一个重要的空格时

set ?="display: none;"" "39" "/span" "." "span
那么最后一个标记是“后跟”“后跟一个未终止的”,所以

简言之,您需要做的是在适当的位置去掉引号。从根本上说,您的问题是第一个标记%%A包含一个不匹配的双引号,这完全破坏了For循环中文本行的解析

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