3

我想解析 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
)
)

我在这里给出了带有颜色格式的代码链接: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
$: "" "

美元 - $: 标记 $ 变量的值,它应该是来自第二个循环的派生列/标记,不带引号。在这里,我寻找不带引号的数字值。这在最后一种情况下失败。

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

所以第二个循环中的令牌 B 是 132,没有引号。看起来不错。但在第三个循环中,它变为 ... style

而第二个循环中的第一个标记是 inline;",第三个循环显示:inline;"" "132" "/span" "span

你能解释一下这是怎么可能的吗?我想在收到第二个成员时看到 132。我可以成功解析前 3 个数字,但这是我无能为力的。

4

1 回答 1

1

您的问题在于解析引号。当线

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" 被替换为

“跨度样式=“显示:无;”“

这被解析为两个标记:

“跨度样式=”显示:

没有任何;””

(因为“ 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 H=span )

或者

set "H=span "

即 H 是字符串跨度后跟一个空格,所以现在你的内部循环

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

等同于(shell 在替换 %% vars 并解析标记之前删除 , 尾随 ")

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

并仔细看看它是如何解析的。“排队;” 是一个字符串,那么 " " 是一个字符串并且嵌入的空格不被视为标记分隔符,然后是 132 还没有空格," " 再次是一个字符串并且嵌入的空格不被视为标记分隔符,然后是/span 和 " " 再次嵌入的空格不被视为标记分隔符,然后最后 span 和空格,因此第一个标记变为

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

接下来,我们得到“for”解析的一个未记录的特征:引号外的 = 被视为空格,因此第二个标记是

set ?=style

然后是第三个标记,从“display: none;”开始 然后是 " " 然后 39 然后 " " 然后/span 然后 " " 然后 . 然后 " " 然后 span,当我们最终遇到一个重要的空格时,所以

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

那么最后一个记号是 " " 后跟 " " 后跟一个未终止的 ",所以

set ?=" "" ""

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

于 2012-08-01T18:11:15.997 回答