【问题标题】:Parsing html file解析html文件
【发布时间】:2012-06-19 19:29:16
【问题描述】:

我想解析 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 个数字,但这是我无能为力的。

【问题讨论】:

    标签: for-loop batch-file cmd


    【解决方案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”被替换为

    "span style="display: none;""

    这会被解析为两个标记:

    "span style="display:

    无;""

    (因为 = 和 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 在替换 %% 变量和解析标记之前删除 , 尾随 ")

    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 循环中文本行的解析。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-10
      • 2017-07-29
      相关资源
      最近更新 更多