找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 26492|回复: 6

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

[复制链接]
发表于 2011-5-20 21:31:41 | 显示全部楼层 |阅读模式
这是一个网友的问题,我想用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素材:
发表于 2011-5-20 22:14:55 | 显示全部楼层
因为没有具体的文件夹及文件数据,下面给出单个的处理示例(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技术 +1 收起 理由
plp626 + 1 不错。。。

查看全部评分

发表于 2011-5-20 22:41:57 | 显示全部楼层
本帖最后由 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技术 +1 收起 理由
plp626 + 1 谢谢参与

查看全部评分

 楼主| 发表于 2011-5-20 22:53:27 | 显示全部楼层
3# zm900612

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

为了效率,你还是把call转化为for循环好些。。。
如果上千个文件,,,当然1个小时的还是能处理完的,,总比人快多了。。。
 楼主| 发表于 2011-5-20 22:56:00 | 显示全部楼层
3# zm900612


对了,你的代码忘了考虑处理 pre内的标签<...>,,
发表于 2011-5-21 00:18:05 | 显示全部楼层
本帖最后由 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
复制代码
发表于 2011-5-21 09:55:20 | 显示全部楼层
本帖最后由 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>$
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-20 10:18 , Processed in 0.021997 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表