[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[文本处理] 怎么用bat提取html文件中pre标签内的部分

这是一个网友的问题,我想用vbs做单没找到代码,最后无奈用了htox32c工具。。。
现在发来,大伙用bat练练手,看谁的代码精简高效通用。
=========================================
问题描述:
如何用bat把html文件中pre标签之间的C代码提取出来,并且过了掉pre标签内的<...>标签。。。有多个*.html 文件,要求提取出 <pre> A </pre>  之间的c 数据结构A.

A中有<>也要去掉,得到的c语言数据结构A保存到同一个文本文件中。
比如
  1. :<pre>
  2.           typedef struct _ALPC_HANDLE_TABLE       // 4 elements, 0x18 bytes (sizeof)
  3.           {
  4. /*0x000*/     struct <a href="ALPC_HANDLE_ENTRY.html">_ALPC_HANDLE_ENTRY</a>* Handles;
  5. /*0x008*/     ULONG32      TotalHandles;
  6. /*0x00C*/     ULONG32      Flags;
  7. /*0x010*/     struct <a href="EX_PUSH_LOCK.html">_EX_PUSH_LOCK</a> Lock;          // 7 elements, 0x8 bytes (sizeof)
  8.           }ALPC_HANDLE_TABLE, *PALPC_HANDLE_TABLE;
  9. </pre>
复制代码
变成:
  1. typedef struct _ALPC_HANDLE_TABLE       // 4 elements, 0x18 bytes (sizeof)
  2.           {
  3. /*0x000*/     struct _ALPC_HANDLE_ENTRY* Handles;
  4. /*0x008*/     ULONG32      TotalHandles;
  5. /*0x00C*/     ULONG32      Flags;
  6. /*0x010*/     struct _EX_PUSH_LOCK Lock;          // 7 elements, 0x8 bytes (sizeof)
  7.           }ALPC_HANDLE_TABLE, *PALPC_HANDLE_TABLE;
复制代码
html素材:

因为没有具体的文件夹及文件数据,下面给出单个的处理示例(html和txt文件全用temp名)
  1. Set fso = CreateObject("scripting.filesystemobject")
  2. Set ws = CreateObject("WScript.shell")
  3. vbstr = Replace(fso.OpenTextFile("temp.html", 1, 1).ReadAll(), "<pre>", "<pre id=text>")
  4. fso.OpenTextFile("temp.html", 2, 1).Write vbstr
  5. GetStr ws.CurrentDirectory & "\temp.html"
  6. Set fso = Nothing
  7. Set ws = nothing
  8. MsgBox "ok"
  9. Function GetStr(pathfile)
  10.   Set oDOM = GetObject(pathfile, "htmlfile")
  11.   Do Until oDOM.readyState="complete":WScript.Sleep 200:Loop
  12.   txt = oDOM.getElementByid("text").innertext
  13.   fso.OpenTextFile("temp.txt", 2, 1).Write txt
  14.   Set oDOM = Nothing
  15. End Function
复制代码
1

评分人数

    • plp626: 不错。。。技术 + 1
***共同提高***

TOP

本帖最后由 zm900612 于 2011-5-20 22:55 编辑

学plp,玩一玩call
  1. @echo off
  2. for /f "tokens=1,2 delims=:" %%a in ('findstr /n "<pre>" *.html') do call>>"%%~na.txt" :pre %%a %%b
  3. pause&exit
  4. :pre
  5. for /f "skip=%2 delims=" %%a in (%~s1) do if "%%a"=="</pre>" (exit /b) else echo %%a
复制代码
1

评分人数

TOP

3# zm900612

思路不错,你最好把<pre> 和</pre> 所在行的内容也输出(替换掉pre),

为了效率,你还是把call转化为for循环好些。。。
如果上千个文件,,,当然1个小时的还是能处理完的,,总比人快多了。。。

TOP

3# zm900612


对了,你的代码忘了考虑处理 pre内的标签<...>,,

TOP

本帖最后由 batman 于 2011-5-21 00:51 编辑

二楼的代码走了弯路(下面是批量处理):
  1. Set fso = CreateObject("scripting.filesystemobject")
  2. Set ws = CreateObject("WScript.shell")
  3. For Each file In fso.GetFolder(ws.CurrentDirectory & "\").files
  4.   If InStr (LCase(file.Name), ".htm") Then GetStr file
  5. next
  6. Set fso = Nothing
  7. Set ws = Nothing
  8. MsgBox "ok"
  9. Function GetStr(pathfile)
  10.   Set oDOM = GetObject(pathfile, "htmlfile")
  11.   Do Until oDOM.readyState="complete":WScript.Sleep 200:Loop
  12.   For Each vbstr In oDOM.getElementsBytagname("pre")
  13.     txt = txt & vbstr.innertext & vbCrLf & vbCrLf
  14.   Next
  15.   fso.OpenTextFile("temp.txt", 8, 1).Write txt & vbCrLf & vbCrLf
  16.   Set oDOM = Nothing
  17. End Function
复制代码
***共同提高***

TOP

本帖最后由 zm900612 于 2011-5-21 09:56 编辑

再来两种:
  1. @echo off&setlocal enabledelayedexpansion
  2. for %%a in (*.html) do (
  3. for /f "delims=" %%b in (%%a) do (
  4. if "%%a" neq "!last!" (
  5. set /a "n=1","t=0"
  6. set last=%%a
  7. cd.>"%%~na.txt"
  8. )
  9. set tmp=$%%b
  10. (if !t!==1 for /f "tokens=1* delims=$" %%b in ("!tmp:</pre>=$!") do echo;%%b
  11. if "!tmp:<pre>=!!tmp:</pre>=!" neq "!tmp!!tmp!" (
  12. set /a "t=^!t"
  13. if "!tmp:<pre>!" neq "!tmp!" (
  14. if !t!==1 echo;!tmp:*^<pre^>=!
  15. )
  16. ))>>"%%~na.txt"
  17. ))
  18. pause
  19. ::这个可以处理与标签同行的内容
复制代码
  1. @echo off&setlocal enabledelayedexpansion 2>nul 3>nul
  2. for /f "tokens=1,2* delims=:" %%a in ('findstr /v /n "<pre> </pre>" *.html') do (
  3. if "%%a" neq "!last!" set /a "n=1","t=0"&set last=%%a&cd.>%%~na.txt
  4. if "%%b"=="!n!" set /a n+=1,"t=^!t" else (
  5. if "!t!"=="0" echo;>>%%~na.txt %%c
  6. set /a n=%%b+2
  7. )
  8. )
  9. pause
复制代码
话说回来,其实用findstr的时候,假如某文件末尾没有换行,那么下个文件会出错,解决方法是先more test.html>$

TOP

返回列表