for-loop - 解析HTML文件

标签 for-loop batch-file cmd

我想解析html文件,并在html的某些部分中找到数字。该脚本的目标是每个 token 获得一个数字。该脚本必须找到属于正确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
$: "" "

美元-$:标记$变量的值,该变量应该是第二个循环中没有引号的派生列/ token 。在这里,我寻找没有引号的数字值。在最后一种情况下,此操作将失败。

字符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

因此,第二个循环中的 token B为132,无引号。看起来还可以。但是在第3循环中,它更改为... 样式

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

您能解释一下这怎么可能吗?我希望看到第2位 member 时在这里132。我可以成功解析前三个数字,但这是我无法帮助的。

最佳答案

您的问题在于报价的解析。当行

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

执行时,您为许多变量分配了包含一个或多个双引号的值。例如,第一次通过循环,G被等效地分配给:
(set G=span style="display: none;")

然后在内部循环中
FOR %%? in ( "%%~A", "%%~B", "%%~C", "%%~D", "%%~E", "%%~F", "%%~G", "%%~H",...

“%%〜G”替换为

“span style =” display:none;“”

这被解析为两个 token :

“span style =” display:



没有;””

(因为,=和display之间的“在开始时会终止”,因此前无空格;然后变为有效)

同样,在您遇到问题的循环的第三次中,将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")

等价于( shell 程序在替换%% vars并解析 token 之前,删除,在“后面加上”)
FOR %%? in ( "inline;"" "132" "/span" "span style="display: none;"" "39" "/span" "." "span " "" "" )

并仔细查看其解析方式。 “排队;”是一个字符串,然后“”是一个字符串,并且嵌入的空间不被视为 token 分隔符,其后是132,尚无空格,“”再次是一个字符串,并且嵌入的空间不被视为 token 分隔符,其后是/ span和“”,其中再次将嵌入空间不视为 token 分隔符,然后最后将span和一个空格,因此第一个 token 变为
set ?="inline;"" "132" "/span" "span

接下来,我们获得“for”解析的一个未记录的功能:引号之外的=被视为空格,因此第二个标记是
set ?=style

然后是第三个标记,从“display:none;”开始然后是“”然后是39,然后是“/跨度然后是”。然后“”然后跨度,当我们最终遇到较大的空间时,
set ?="display: none;"" "39" "/span" "." "span

然后,最后一个标记是“”,然后是“”,然后是未终止的“
set ?=" "" ""

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

关于for-loop - 解析HTML文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11108012/

相关文章:

batch-file - DOS批处理文件for循环中的变量赋值问题

windows - 批处理文件,用于将超过 30 分钟的文件从一个文件夹复制到另一个文件夹

javascript - 从对象和数组创建对象数组

windows - WMIC.bat 文件无法正确导出/输出

sql-server - 使用转义引号将 SQL 数据库批量导出为 CSV

windows - 奇怪的 Windows DIR 命令行为

在 CGI 脚本中使用 popen 调用系统 cmd

batch-file - 按渐进数字顺序对列表进行排序

python - 当 `pop` 循环列表时 `for` -ing 元素发生了什么

Javascript 哈希器嵌套函数