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

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

[复制链接]
 楼主| 发表于 2024-7-9 10:08:12 | 显示全部楼层
回复  hnfeng

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



    谢谢谢谢
发表于 2024-7-9 15:33:08 | 显示全部楼层
本帖最后由 qixiaobin0715 于 2024-7-9 15:45 编辑

楼主未直接提供html文件,只是摘写了片段,不知实际内容如何。按照顶楼文件片段分析,如果要使用findstr命令,可提取行首带有“<td”标签的行,来过滤掉无用的内容,而不需要考虑的太复杂。像这样使用:
  1. findstr /b "<td" 1.html
复制代码
 楼主| 发表于 2024-7-9 17:00:48 | 显示全部楼层
回复 32# qixiaobin0715


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

我把一个html文件传到度盘吧,有想继续研究的请看看(7天有效期)
  1. https://pan.baidu.com/s/1_tWWy4L-C8qftA0T3qwGGQ?pwd=1234
复制代码
 楼主| 发表于 2024-7-9 17:02:56 | 显示全部楼层
回复 20# aloha20200628

文件发这里了
  1. https://pan.baidu.com/s/1_tWWy4L-C8qftA0T3qwGGQ?pwd=1234
复制代码
发表于 2024-7-9 17:34:22 | 显示全部楼层
回复 34# hnfeng

将29楼代码存为utf-8编码脚本,用楼主最新提供的 ‘3_2.5_activity_H2J_Log_Page1.html’ (更名为代码中设定的 1.html)测试顺利通过
 楼主| 发表于 2024-7-9 17:52:41 | 显示全部楼层
回复  hnfeng

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



    是的是的,上面多位朋友的代码都可以顺利通过
发表于 2024-7-9 18:24:16 | 显示全部楼层
本帖最后由 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

复制代码
发表于 2024-7-9 19:47:35 | 显示全部楼层
本帖最后由 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字符数据’...
发表于 2024-7-9 20:35:03 | 显示全部楼层
跟跑本帖至此,可对findstr/find匹配 ‘双字节数据如中文数据’ 的能力给一个小结,针对楼主所给网页测试 ...
aloha20200628 发表于 2024-7-9 19:47



总之,放弃这些没有前途的,改 powershell
发表于 2024-7-9 21:53:06 | 显示全部楼层
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]);
复制代码
发表于 2024-7-9 22:29:12 | 显示全部楼层
回复 39# newswan


    个人观点:
你认为"有前途"的,其他人或许认为就是辣鸡。
不管啥方法,只要能解决实际问题,没有绝对好坏之分。
发表于 2024-7-17 09:29:36 | 显示全部楼层
回复 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
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-3-18 00:18 , Processed in 0.019500 second(s), 7 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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