标题: [文本处理] 怎么用bat提取html文件中pre标签内的部分 [打印本页]
作者: plp626 时间: 2011-5-20 21:31 标题: 怎么用bat提取html文件中pre标签内的部分
这是一个网友的问题,我想用vbs做单没找到代码,最后无奈用了htox32c工具。。。
现在发来,大伙用bat练练手,看谁的代码精简高效通用。
=========================================
问题描述:
如何用bat把html文件中pre标签之间的C代码提取出来,并且过了掉pre标签内的<...>标签。。。有多个*.html 文件,要求提取出 <pre> A </pre> 之间的c 数据结构A.
A中有<>也要去掉,得到的c语言数据结构A保存到同一个文本文件中。
比如- :<pre>
- typedef struct _ALPC_HANDLE_TABLE // 4 elements, 0x18 bytes (sizeof)
- {
- /*0x000*/ struct <a href="ALPC_HANDLE_ENTRY.html">_ALPC_HANDLE_ENTRY</a>* Handles;
- /*0x008*/ ULONG32 TotalHandles;
- /*0x00C*/ ULONG32 Flags;
- /*0x010*/ struct <a href="EX_PUSH_LOCK.html">_EX_PUSH_LOCK</a> Lock; // 7 elements, 0x8 bytes (sizeof)
- }ALPC_HANDLE_TABLE, *PALPC_HANDLE_TABLE;
- </pre>
复制代码
变成:- typedef struct _ALPC_HANDLE_TABLE // 4 elements, 0x18 bytes (sizeof)
- {
- /*0x000*/ struct _ALPC_HANDLE_ENTRY* Handles;
- /*0x008*/ ULONG32 TotalHandles;
- /*0x00C*/ ULONG32 Flags;
- /*0x010*/ struct _EX_PUSH_LOCK Lock; // 7 elements, 0x8 bytes (sizeof)
- }ALPC_HANDLE_TABLE, *PALPC_HANDLE_TABLE;
复制代码
html素材:
作者: batman 时间: 2011-5-20 22:14
因为没有具体的文件夹及文件数据,下面给出单个的处理示例(html和txt文件全用temp名)- Set fso = CreateObject("scripting.filesystemobject")
- Set ws = CreateObject("WScript.shell")
- vbstr = Replace(fso.OpenTextFile("temp.html", 1, 1).ReadAll(), "<pre>", "<pre id=text>")
- fso.OpenTextFile("temp.html", 2, 1).Write vbstr
- GetStr ws.CurrentDirectory & "\temp.html"
- Set fso = Nothing
- Set ws = nothing
- MsgBox "ok"
-
- Function GetStr(pathfile)
- Set oDOM = GetObject(pathfile, "htmlfile")
- Do Until oDOM.readyState="complete":WScript.Sleep 200:Loop
- txt = oDOM.getElementByid("text").innertext
- fso.OpenTextFile("temp.txt", 2, 1).Write txt
- Set oDOM = Nothing
- End Function
复制代码
作者: CrLf 时间: 2011-5-20 22:41
本帖最后由 zm900612 于 2011-5-20 22:55 编辑
学plp,玩一玩call- @echo off
- for /f "tokens=1,2 delims=:" %%a in ('findstr /n "<pre>" *.html') do call>>"%%~na.txt" :pre %%a %%b
- pause&exit
- :pre
- for /f "skip=%2 delims=" %%a in (%~s1) do if "%%a"=="</pre>" (exit /b) else echo %%a
复制代码
作者: plp626 时间: 2011-5-20 22:53
3# zm900612
思路不错,你最好把<pre> 和</pre> 所在行的内容也输出(替换掉pre),
为了效率,你还是把call转化为for循环好些。。。
如果上千个文件,,,当然1个小时的还是能处理完的,,总比人快多了。。。
作者: plp626 时间: 2011-5-20 22:56
3# zm900612
对了,你的代码忘了考虑处理 pre内的标签<...>,,
作者: batman 时间: 2011-5-21 00:18
本帖最后由 batman 于 2011-5-21 00:51 编辑
二楼的代码走了弯路(下面是批量处理):- Set fso = CreateObject("scripting.filesystemobject")
- Set ws = CreateObject("WScript.shell")
- For Each file In fso.GetFolder(ws.CurrentDirectory & "\").files
- If InStr (LCase(file.Name), ".htm") Then GetStr file
- next
- Set fso = Nothing
- Set ws = Nothing
- MsgBox "ok"
-
- Function GetStr(pathfile)
- Set oDOM = GetObject(pathfile, "htmlfile")
- Do Until oDOM.readyState="complete":WScript.Sleep 200:Loop
- For Each vbstr In oDOM.getElementsBytagname("pre")
- txt = txt & vbstr.innertext & vbCrLf & vbCrLf
- Next
- fso.OpenTextFile("temp.txt", 8, 1).Write txt & vbCrLf & vbCrLf
- Set oDOM = Nothing
- End Function
复制代码
作者: CrLf 时间: 2011-5-21 09:55
本帖最后由 zm900612 于 2011-5-21 09:56 编辑
再来两种:- @echo off&setlocal enabledelayedexpansion
- for %%a in (*.html) do (
- for /f "delims=" %%b in (%%a) do (
- if "%%a" neq "!last!" (
- set /a "n=1","t=0"
- set last=%%a
- cd.>"%%~na.txt"
- )
- set tmp=$%%b
- (if !t!==1 for /f "tokens=1* delims=$" %%b in ("!tmp:</pre>=$!") do echo;%%b
- if "!tmp:<pre>=!!tmp:</pre>=!" neq "!tmp!!tmp!" (
- set /a "t=^!t"
- if "!tmp:<pre>!" neq "!tmp!" (
- if !t!==1 echo;!tmp:*^<pre^>=!
- )
- ))>>"%%~na.txt"
- ))
- pause
- ::这个可以处理与标签同行的内容
复制代码
- @echo off&setlocal enabledelayedexpansion 2>nul 3>nul
- for /f "tokens=1,2* delims=:" %%a in ('findstr /v /n "<pre> </pre>" *.html') do (
- if "%%a" neq "!last!" set /a "n=1","t=0"&set last=%%a&cd.>%%~na.txt
- if "%%b"=="!n!" set /a n+=1,"t=^!t" else (
- if "!t!"=="0" echo;>>%%~na.txt %%c
- set /a n=%%b+2
- )
- )
- pause
复制代码
话说回来,其实用findstr的时候,假如某文件末尾没有换行,那么下个文件会出错,解决方法是先more test.html>$
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |