2012-06-19 169 views
3

我想解析html文件,並在找到號碼在html的某些部分。這個腳本的目標是每個令牌獲得一個數字。該腳本必須找到屬於正確IP地址的號碼。解析html文件

這些數字是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 
$: "" " 

美元 - $:標記$ 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 
$: "" " 

如果你想看到這部分的顏色,請訪問以下鏈接: http://www.dostips.com/forum/viewtopic.php?f=3&t=3435

所以在第二循環中的令牌B是132,不包括引號。它看起來不錯。但在第三個循環中,它變爲... 風格

而在第二環1令牌是內聯;「第三循環顯示:內聯‘;’‘132’‘/跨度’」跨度

你能解釋我這怎麼可能?我想在第二位成員收到時看到132。我可以成功解析前3個數字,但這是我無法提供的幫助。

回答

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」被替換爲

「跨度風格=」 顯示:無; 「」

並且這被解析爲兩個標記:

「跨度風格=」 顯示:

無 「;」

(因爲,在 「=與顯示器之間終止」 在開始,所以沒有之前的空間;成爲顯著)

同樣通過循環的第三次,這是你有問題,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和「」,其中再次嵌入的空間不是作爲標記分隔處理,最後跨越和空間,所以第一個令​​牌將

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

接下來,我們獲取的無證功能「爲」解析:報價的=外被處理像的空間,因此第二令牌是

set ?=style 

然後第三令牌,則啓動「顯示:無;」然後是「」,然後是39,然後是「」,然後是「跨度」然後是「」。然後「」然後跨越,當我們終於遇到一個顯著的空間,所以

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

那麼最後的令牌「」其次「其次是未終止」」,所以

set ?=" "" "" 

總之,你需要做的是在適當的地方擺脫引號。基本上,你的問題是第一個標記%% A包含一個不匹配的雙引號,並且這完全無法解析For循環中的文本行。