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

[文本处理] [已解决]如何使用 gawk.exe 获取html文件中的字符串?

本帖最后由 hnfeng 于 2024-7-9 08:12 编辑

下面代码是 html 文件的一部分
  1. <一些无关字符>
  2. <table width="100%" border="1" cellpadding="5" cellspacing="0" bordercolor="#E3F2FD">
  3. <tr bgcolor="#1565C0"><td colspan="4"><strong><font color="#FFFFFF" size="3" face="Segoe UI Variable, Segoe UI, Verdana, sans-serif">日志报告:概述</font></strong>
  4. </td></tr>
  5. <tr>
  6. <td bgcolor="#BBDEFB"><strong><font color="#000077" size="3" face="Segoe UI Variable, Segoe UI, Verdana, sans-serif">任务名称</font></strong></td>
  7. <td width="23%" bgcolor="#FFFFFF"><font size="3" face="Segoe UI Variable, Segoe UI, Verdana, sans-serif">2.5_activity_H2J</font></td>
  8. <td bgcolor="#BBDEFB"><font color="#000077" size="3" face="Segoe UI Variable, Segoe UI, Verdana, sans-serif"><strong>类别</strong></font></td>
  9. <一些无关字符>
  10. </tr>
  11. <tr>
  12. <td bgcolor="#BBDEFB"><strong><font color="#000077" size="3" face="Segoe UI Variable, Segoe UI, Verdana, sans-serif">开始检查</font></strong></td>
  13. <td width="23%" bgcolor="#FFFFFF"><font size="3" face="Segoe UI Variable, Segoe UI, Verdana, sans-serif">2024-07-05 23:14:49</font></td>
  14. <td bgcolor="#BBDEFB"><font color="#000077" size="3" face="Segoe UI Variable, Segoe UI, Verdana, sans-serif"><strong>检查完毕</strong></font></td>
  15. <td width="39%" bgcolor="#FFFFFF"><font size="3" face="Segoe UI Variable, Segoe UI, Verdana, sans-serif">2024-07-06 02:34:51 (3 小时, 20 分钟, 2 秒)</font></td>
  16. </tr>
  17. <tr>
  18. <td bgcolor="#BBDEFB"><strong><font color="#000077" size="3" face="Segoe UI Variable, Segoe UI, Verdana, sans-serif">同步任务开始时间</font></strong></td>
  19. <td width="23%" bgcolor="#FFFFFF"><font size="3" face="Segoe UI Variable, Segoe UI, Verdana, sans-serif">2024-07-05 21:06:08</font></td>
  20. <td bgcolor="#BBDEFB"><font color="#000077" size="3" face="Segoe UI Variable, Segoe UI, Verdana, sans-serif"><strong>同步任务结束时间</strong></font></td>
  21. <td width="39%" bgcolor="#FFFFFF"><font size="3" face="Segoe UI Variable, Segoe UI, Verdana, sans-serif">2024-07-06 02:44:46 (5 小时, 38 分钟, 37 秒)</font></td>
  22. </tr>
  23. </table>
  24. <一些无关字符>
复制代码
想获取里面的信息:
2.5_activity_H2J
2024-07-05 21:06:08
2024-07-05 23:14:49
2024-07-06 02:34:51
2024-07-06 02:44:46

请教怎样使用 gawk.exe (其他批处理、第三方也可以)获取上面的字符串,存到一个文本文件中。
多谢了

回复 1# hnfeng
用gawk的解决方法如下:
下载特定版本(mbcs,3.1.7) ( http://bcn.bathome.net/tool/mbcs,3.1.7/gawk.exe )

一、在命令行下执行:
  1. gawk -W ctype=UTF8 "/(\344\273\273\345\212\241\345\220\215\347\247\260)|(\345\220\214\346\255\245\344\273\273\345\212\241\345\274\200\345\247\213\346\227\266\351\227\264)|(\345\274\200\345\247\213\346\243\200\346\237\245)|(\346\243\200\346\237\245\345\256\214\346\257\225)|(\345\220\214\346\255\245\344\273\273\345\212\241\347\273\223\346\235\237\346\227\266\351\227\264)/{A=1;next}A==1{A=0;print substr(gensub(/^<.+>([^<>]+)<.+>$/,\"\\1\",\"1\",$0),1,19)}" 3_2.5_activity_H2J_Log_Page1.html>out.txt
复制代码
二、将以下文本以utf-8编码保存为a.awk
  1. /(任务名称)|(同步任务开始时间)|(开始检查)|(检查完毕)|(同步任务结束时间)/ {
  2. A = 1
  3. next
  4. }
  5. A == 1 {
  6. A = 0
  7. print substr(gensub(/^<.+>([^<>]+)<.+>$/, "\\1", "1", $0), 1, 19)
  8. }
复制代码
然后在命行下执行:gawk -W ctype=UTF8 -fa.awk 3_2.5_activity_H2J_Log_Page1.html>out.txt

TOP

回复 39# newswan


    个人观点:
你认为"有前途"的,其他人或许认为就是辣鸡。
不管啥方法,只要能解决实际问题,没有绝对好坏之分。

TOP

Test.bat,脚本保存为ANSI编码
  1. @if(0)==(0) echo off
  2. cscript //nologo //e:jscript "%~f0" 1.html > 1.txt
  3. pause & exit
  4. @end
  5. var srcFile = WSH.Arguments(0);
  6. var obj = {任务名称:'', 同步任务开始时间:'', 开始检查:'', 检查完毕:'', 同步任务结束时间:''}
  7. var getText = function(file) {
  8.     var ado = new ActiveXObject('ADODB.Stream');
  9.     ado.Mode = 3;
  10.     ado.Type = 2;
  11.     ado.Charset = 'utf-8';
  12.     ado.Open();
  13.     ado.LoadFromFile(file);
  14.     var str = ado.ReadText(-1);
  15.     ado.Close();
  16.     return str;
  17. }
  18. var html = new ActiveXObject('htmlfile');
  19. html.write(getText(srcFile));
  20. var node = html.getElementsByTagName('td')
  21. for(var i=0; i<node.length-1; i++){
  22.     var s = node[i].innerText;
  23.     if (obj.hasOwnProperty(s)) obj[s] = node[i+1].innerText.replace(/\(.*$/, '');
  24. }
  25. for (var k in obj) WSH.Echo(obj[k]);
复制代码

TOP

跟跑本帖至此,可对findstr/find匹配 ‘双字节数据如中文数据’ 的能力给一个小结,针对楼主所给网页测试 ...
aloha20200628 发表于 2024-7-9 19:47



总之,放弃这些没有前途的,改 powershell

TOP

本帖最后由 aloha20200628 于 2024-7-9 19:52 编辑


跟跑本帖至此,可对findstr/find匹配 ‘双字节数据如中文数据’ 的能力给一个小结,针对楼主所给网页测试文件的实测结果》
一。若网页文件是系统默认编码(936或gb2312或记事本ansi)
      findstr 用 /c:"..." 或 /lc:"..." 或 /rc:"..." 或 /ic:"..." 参数均可成功匹配测试文件中的5个中文关键词
二。若网页文件是utf-8编码
      findstr 用 /c:"..." 或 /lc:"..." 或 /rc:"..." 或 /ic:"..." 参数均未成功匹配测试文件中的5个中文关键词
      改用 find 即可成功匹配测试文件中的5个中文关键词(备注:find不支持正则表达式)
三。无论文本文件是系统默认编码还是utf-8编码,cmd窗口采用936或65001码页均可正确显示 ‘其中的ascii字符’,故无须专门切换相应的码页,findstr 即可成功匹配 ‘文件中的ascii字符数据’...

TOP

本帖最后由 newswan 于 2024-7-9 18:28 编辑

powershell
  1. $file = ".\3_2.5_activity_H2J_Log_Page1.html"
  2. $Hash = [Ordered]@{ "任务名称" = "" ; "开始检查" = "" ; "检查完毕" = "" ; "同步任务开始时间" = "" ; "同步任务结束时间" = "" }
  3. $arr = (( Get-Content -Path $file -Encoding UTF8 -Raw ) -replace "<[^>]*>" -replace "`r" ) -split "`n"
  4. for ( $i=0 ; $i -lt $arr.Count ; $i++ ) {
  5. if ( $arr[$i] -in $hash.Keys ) {
  6. $hash[$arr[$i]] = $arr[$i+1]
  7. }
  8. }
  9. $Hash
复制代码

TOP

回复  hnfeng

将29楼代码存为utf-8编码脚本,用楼主最新提供的 ‘3_2.5_activity_H2J_Log_Page1.html’ ...
aloha20200628 发表于 2024-7-9 17:34



    是的是的,上面多位朋友的代码都可以顺利通过

TOP

回复 34# hnfeng

将29楼代码存为utf-8编码脚本,用楼主最新提供的 ‘3_2.5_activity_H2J_Log_Page1.html’ (更名为代码中设定的 1.html)测试顺利通过

TOP

回复 20# aloha20200628

文件发这里了
  1. https://pan.baidu.com/s/1_tWWy4L-C8qftA0T3qwGGQ?pwd=1234
复制代码

TOP

回复 32# qixiaobin0715


上面多位网友的代码都能实现,目前使用了18楼的代码(主要因为我能看懂)

我把一个html文件传到度盘吧,有想继续研究的请看看(7天有效期)
  1. https://pan.baidu.com/s/1_tWWy4L-C8qftA0T3qwGGQ?pwd=1234
复制代码

TOP

本帖最后由 qixiaobin0715 于 2024-7-9 15:45 编辑

楼主未直接提供html文件,只是摘写了片段,不知实际内容如何。按照顶楼文件片段分析,如果要使用findstr命令,可提取行首带有“<td”标签的行,来过滤掉无用的内容,而不需要考虑的太复杂。像这样使用:
  1. findstr /b "<td" 1.html
复制代码

TOP

回复  hnfeng

如果改用 find.exe 匹配utf-8网页中的汉字数据无误,可用以下代码一气呵成...
aloha20200628 发表于 2024-7-9 09:28



    谢谢谢谢

TOP

回复  qixiaobin0715
代码12、13行的数字5可改为!n!,这样更通用一些。
qixiaobin0715 发表于 2024-7-9 08:20



    谢谢谢谢,已经更新

TOP

本帖最后由 aloha20200628 于 2024-7-9 19:56 编辑

回复 27# hnfeng

如果改用 find.exe 匹配utf-8网页中的汉字数据无误,可用以下代码一气呵成,无须用批处逐行遍历整个网页,也免去sort排序...
  1. @echo off &chcp 65001>nul&@echo off &del/q 1.txt 2>nul &set "hF=1.html"
  2. set "kws=任务名称,同步任务开始时间,开始检查,检查完毕,同步任务结束时间"
  3. :[loop]
  4. for /f "tokens=1* delims=," %%a in ("%kws%") do set "kw=%%a"&set "kws=%%b"
  5. for /f "tokens=1 delims=[]" %%n in ('find /n ">%kw%<" "%hF%"^|more +2') do set/a "n=%%n+1"
  6. (for /f "tokens=4 delims=<>(" %%a in (' findstr /n ".*" "%hF%"^|findstr /lbc:"%n%:" ') do echo,%%a)>>1.txt
  7. if "%kws%"=="" (pause&exit/b) else goto[loop]
复制代码

TOP

返回列表