Board logo

标题: [文本处理] [已解决]求助:下载并处理网页另生成文件的批处理 [打印本页]

作者: 447219071    时间: 2015-9-18 23:51     标题: [已解决]求助:下载并处理网页另生成文件的批处理

想实现下载网页,提取指定字符之间的内容,像网页源码一样,前面后面不空行,不空格(中间有空格除外),实现生成的文本文件如下
  1. start "" http://www.1.com
  2. start "" http://www.2.com
  3. start "" http://www.3.com
  4. start "" http://www.4.com
复制代码
而本人大致写出的批处理如下,请高手指教:
  1. ping blog.sina.com.cn && goto dianxin || goto tietong ::判断是否电线或铁通,选择最快的网页下载
  2. :dianxin
  3. aria2c.exe -d D:\ -o 1.htm http://blog.sina.com.cn/s/blog_823cbc920100v5gj.html ::将网页下载到D盘并改名1.txt
  4. ???代码不知 >a.txt ::将下载的改名的1.htm提取两个“**********”之间的内容并生成a.txt,其内容见最上面的代码行
  5. del 1.htm ::删除多余的文件
  6. exit
  7. :tietong
  8. aria2c.exe -d D:\ -o 1.htm http://chren123.blog.163.com/blog/static/253137098201581811214839/ ::将网页下载到D盘并改名1.txt
  9. ???代码不知 >a.txt ::将下载的改名的1.htm提取两个“**********”之间的内容并生成a.txt,其内容见最上面的代码行
  10. del 1.htm ::删除多余的文件
  11. exit
复制代码
上述两个网页的源码见附件


经验证:二楼的代码在手动运行有效,但一旦调用命令形式就无法正常运行
作者: pcl_test    时间: 2015-9-19 10:17

本帖最后由 pcl_test 于 2015-9-19 10:27 编辑

全部htm下载完成后运行
  1. //&cls&dir /b *.htm|cscript.exe -nologo -e:jscript "%~f0"&pause&exit/b
  2. while(!WScript.StdIn.AtEndOfStream){
  3.     var file = WScript.StdIn.ReadLine();
  4.     var fname = file.replace(/\.[^\.]*$/,'');
  5.     var fso = new ActiveXObject("Scripting.FileSystemObject");
  6.     var f = fso.OpenTextFile(file,1);
  7.     var txt = f.ReadAll().match(/\*{8,}[\s\S]+?\*{8,}/m)[0];
  8.     var m = txt.match(/start[^<]+/img);
  9.     var str = '';
  10.     for (var i=0;i<m.length;i++){
  11.         str +=m[i].replace(/\r?\n/g,' ')+'\r\n';
  12.     }
  13.     fso.CreateTextFile(fname+'.txt',2).Write(str);
  14. }
复制代码

作者: 447219071    时间: 2015-9-20 15:12

回复 2# pcl_test


    在桌面运行阁下的代码可以执行,但到其他如下图目录就不能执行,可否将其整合到一个批处理当中?另外这里无需pause
作者: 回家路上    时间: 2015-9-20 15:25

保证批处理和html放在一个文件夹下
作者: 447219071    时间: 2015-9-20 18:50

本帖最后由 447219071 于 2015-9-30 23:36 编辑

回复 4# 回家路上 [code]echo //&cls&dir /b *.htm|cscript.exe -nologo -e:jscript "%~f0"&pause&exit/b >D:\run.bat
echo while(!WScript.StdIn.AtEndOfStream){ >D:\run.bat
echo     var file = WScript.StdIn.ReadLine(); >D:\run.bat
echo     var fname = file.replace(/\.[^\.]*$/,''); >D:\run.bat
echo     var fso = new ActiveXObject("Scripting.FileSystemObject"); >D:\run.bat
echo     var f = fso.OpenTextFile(file,1); >D:\run.bat
echo     var txt = f.ReadAll().match(/\*{8,}[\s\S]+?\*{8,}/m)[0]; >D:\run.bat
echo     var m = txt.match(/start[^<]+/img); >D:\run.bat
echo     var str = ''; >D:\run.bat
echo     for (var i=0;i<m.length;i++){ >D:\run.bat
echo         str +=m.replace(/\r?\n/g,' ')+'\r\n'; >D:\run.bat
echo     } >D:\run.bat
echo     fso.CreateTextFile(fname+'.txt',2).Write(str); >D:\run.bat
echo } >D:\run.bat
作者: 回家路上    时间: 2015-9-20 19:04

本帖最后由 回家路上 于 2015-9-20 19:07 编辑

第一步,你得到的run.bat并不正确,自己先试试调正确
(1)echo;想要输出特殊字符,需要转义,像要输出这整个run.bat。。。。多调试
(2)“>”会将原有的文本内容都给覆盖了,要换成">>",或最后整体输出到文件
  1. (
  2. echo;1111
  3. echo;1111
  4. echo;1111
  5. )>D:\run.bat
复制代码

作者: 回家路上    时间: 2015-9-21 15:58

本帖最后由 回家路上 于 2015-9-21 16:00 编辑

回复 1# 447219071


经验证:二楼的代码在手动运行有效,但一旦调用命令形式就无法正常运行????
什么个意思??怎么个验证法??
作者: 447219071    时间: 2015-9-21 16:26

回复 7# 回家路上

经多次测试,用命令行形式调用你的批处理会出现错误,但手动打开没有问题!可能是命令行调用JScript的原因吧。
能否像这样的方式处理,虽然处理慢,可能要针对两个网页写两个命令,但是能正常执行
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set flag=
  4. for /f "tokens=1* delims=<" %%a in (1.html) do (
  5.   if !flag!==3 goto :eof
  6.   if "%%a" neq "************" if !flag!==2 echo %%a >>a.txt
  7.   echo %%a >%temp%\tmp
  8.   find "********" %temp%\tmp >nul && set /a flag+=1
  9. )
  10. del %temp%\tmp
复制代码

作者: 447219071    时间: 2015-9-21 18:06

回复 7# 回家路上


    就是用另一批处理调用或CMD下就无效




欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2