批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程
[批处理文件精品]批处理版照片整理器[批处理文件精品]纯批处理备份&还原驱动在线第三方下载
返回列表 发帖

[文本处理] 如何批量提取HTML文件h1行,和下一页行,根据特征生成新链接保存为TXT

有一些HTML文件,例如下面结构:
  1. <!doctype html>
  2. <html>
  3. <head>
  4. …………
  5. …………
  6. …………
  7. <h1>cosplay《尼尔:机械纪元》尤尔哈2B (2 / 11)</h1>
  8. …………
  9. …………
  10. …………
  11. <a href="1209.html">上一页</a>
  12. <a href="1209.html">1</a><b>2</b>
  13. <a href="1209_3.html">3</a>
  14. <a href="1209_4.html">4</a>
  15. <a href="1209_5.html">5</a>
  16. <a href="1209_6.html">6</a>
  17. <a href="1209_3.html">下一页</a>
  18. …………
  19. …………
  20. …………
  21. </body>
  22. </html>
复制代码
提取<h1>行后,获得(2 / 11)内的数值,
数字2表示在第二页,不需要,
数字11表示最大11页,需要提取的就是这个;

提取下一页</a>这一行,获得1209_3.html,
主要是在这里生成,
  1. http://www.xxxxx.com/cosplay/img/1029/1209.jpg
  2. http://www.xxxxx.com/cosplay/img/1029/1209_2.jpg
  3. http://www.xxxxx.com/cosplay/img/1029/1209_3.jpg
  4. http://www.xxxxx.com/cosplay/img/1029/1209_4.jpg
  5. http://www.xxxxx.com/cosplay/img/1029/1209_5.jpg
  6. http://www.xxxxx.com/cosplay/img/1029/1209_6.jpg
  7. http://www.xxxxx.com/cosplay/img/1029/1209_7.jpg
  8. http://www.xxxxx.com/cosplay/img/1029/1209_8.jpg
  9. http://www.xxxxx.com/cosplay/img/1029/1209_9.jpg
  10. http://www.xxxxx.com/cosplay/img/1029/1209_10.jpg
  11. http://www.xxxxx.com/cosplay/img/1029/1209_11.jpg
复制代码
将生成的jpg链接内容保存为新的文件,和网页文件一致并且在后面添加。TXT

如果<h1>后面的内容是(1 / 1)或没有内容,则不提取
  1. <h1>cosplay《尼尔:机械纪元》尤尔哈2B (1 / 1)</h1>
  2. <h1>cosplay《尼尔:机械纪元》尤尔哈2B</h1>
复制代码

本帖最后由 hlzj88 于 2023-1-20 22:20 编辑

你的意思是  要在11这个数的位置获得11这个数,在下一页行获得1209_3.html这个文件名,然后往1209_3.html里写入haaap://www.xxxxx.com/cosplay/img/1029/1209_2.jpg至11.jpg这些内容吗?当在11位置获得的数是1时,表示没有下一页存在,也就不产生新文件和内容吗?
haaap://www.xxxxx.com/cosplay/img/1029/1209_2.jpg这个是提取的还是生成的。或者很有规律,可以用生成的方法来生成?
用aaa代替tt是因为发帖会把它理解为一个网络图片,
你的第一句话  有一些html文件,是本地文件还是网络地址可以下载的?

你应该提供样例,描述不是很明白。
目的,学习批处理

TOP

链接是生成的,也就是1209_3.html
提取第一个()的内容
(\d+)_\d+\.html\">下一页<\/a>
也就是1209
然后拼接,生成http…………jpg链接
  1. @if(0)==(0) echo off
  2. rem 保存为ANSI编码的BAT文件
  3. for /f "tokens=* delims=" %%a in ('dir /b *.html^|cscript -nologo -e:jscript "%~0"') do (
  4.     echo %%a
  5. )
  6. pause & exit/b
  7. @end
  8. fso = new ActiveXObject("Scripting.FileSystemObject");
  9. while (!WSH.StdIn.AtEndOfStream) {
  10.     f = WSH.StdIn.ReadLine();
  11.     str = fso.OpenTextFile(f,1).ReadAll();
  12.     s1 = str.match(/<h1>.+\(\d+ \/ ([2-9]|\d{2})\)<\/h1>/)[1];//提取<h1>标题中大于等于2的数字
  13.     if(str == null || s1 == null)continue;
  14.     s2 = str.match(/([0-9]+)_[0-9]+.html\">下一页<\/a>/)[1];//提取x_x.heml字符串_之前的数字
  15.     s3 = 'http://www.xxxxx.com/cosplay/img/'+s2+'/';
  16.     txt = '';
  17.     for(i = 1; i <= s1; i ++) {
  18.     if(i == "1") {
  19.         txt += s3+s2+'.jpg\n';
  20.         } else {
  21.         txt += s3+s2+'_'+i+'.jpg\n';
  22.     }
  23. }
  24. WSH.Echo(txt);
  25. }
复制代码
这个问题是,如果出现下面这种情况会报错
  1. <h1>cosplay《尼尔:机械纪元》尤尔哈2B (1 / 1)</h1>
  2. <h1>cosplay《尼尔:机械纪元》尤尔哈2B</h1>
复制代码

TOP

本帖最后由 terse 于 2023-1-21 10:24 编辑

你自己在加一下判断几个变量值 空的话不执行
  1. var reg = /\d+(?=\s*\)<\/h1>)/,
  2. re = /[^"]+(?=\">下一页<\/a>)/;
  3. s = 'http://www.xxxxx.com/cosplay/img/'
  4. while (!WSH.StdIn.AtEndOfStream) {
  5.     var f = WSH.StdIn.ReadLine(),
  6.     fso = new ActiveXObject("Scripting.FileSystemObject"),
  7.     str = fso.OpenTextFile(f,1).ReadAll(),
  8.     s1 = reg.test(str)?str.match(reg):'';
  9.     s2 = re.test(str)?str.match(re):'';
  10.     WSH.Echo(s,s2,s1);
  11. }
复制代码
1

评分人数

TOP

我是这样操作的,但是不加try部分还是会提示null,
判断变量等于null为什么跳出循环失败了
  1. @if(0)==(0) echo off
  2. rem 保存为ANSI编码的BAT文件
  3. for /f "delims=" %%a in ('dir /a:d /b') do (
  4. pushd "%%a" &echo 进入文件夹下载图片: %~dp0%%a
  5.     for /f "tokens=* delims=" %%b in ('dir /b *.html^|cscript -nologo -e:jscript "%~0"') do (
  6.         echo %%b
  7.         start /I /MIN cmd /k "%%b&&exit"
  8.         timeout 30
  9.     )
  10. popd
  11. )
  12. pause & exit/b
  13. @end
  14. fso = new ActiveXObject("Scripting.FileSystemObject");
  15. while (!WSH.StdIn.AtEndOfStream) {
  16.     f = WSH.StdIn.ReadLine();
  17.     Name = f.match(/(.+)\.html/)[1];
  18. try{
  19.     str = fso.OpenTextFile(f,1).ReadAll();
  20.     s1 = str.match(/<h1>.+\(1 \/ ([2-9]|\d{2})\)<\/h1>/)[1]; //提取<h1>标题中大于等于2的数字
  21.     if ( str == null || s1 == null )continue; //变量null跳出循环,就这里还是提示null
  22.     s2 = str.match(/([0-9]+)_[0-9]+.html/)[1]; //提取x_x.heml字符串_之前的数字
  23.     s3 = 'http://www.xxxxx.com/cosplay/img/'+s2+'/'; //链接地址拼接
  24.     txt = '';
  25.     for(i = 1; i <= s1; i ++) {
  26.     if(i == "1") {
  27.         txt += s3+s2+'.jpg\n';
  28.     curl = "curl -o "+s2+".jpg "+s3+s2+'.jpg\n'; //添加curl下载命令,交给%%b下载
  29.         } else {
  30.         txt += s3+s2+'_'+i+'.jpg\n';
  31.     curl = "curl -o "+s2+'_'+i+".jpg "+s3+s2+'_'+i+'.jpg\n'; //添加curl下载命令,交给%%b下载
  32.     }
  33.     WSH.echo(curl);//显示内容
  34. }
  35.     fso.CreateTextFile(Name + ".txt" ,2, true).Write(txt);//保存到提取文件
  36. }
  37. catch(err){}
  38. }
复制代码

TOP

你这样会有匹配不到的情况吧
要不按4楼的正则处理看结果如何 你加一个判断是否匹配到

TOP

是的,没有(1 / 11)这种格式就提示null,
现在有个问题,有条件没达到,就会输出空文件。
  1. @if(0)==(0) echo off
  2. rem 保存为ANSI编码的BAT文件
  3. for /f "delims=" %%a in ('dir /a:d /b') do (
  4. pushd "%%a" &echo 进入文件夹下载图片: %~dp0%%a
  5.     for /f "delims=" %%b in ('dir /b *.html^|findstr /i /v "_[0-9]*.html$"') do (
  6.         for /f "tokens=* delims=" %%c in ('echo %%b^|cscript -nologo -e:jscript "%~0"') do (
  7.         echo %%c
  8.         start /I /MIN cmd /k "%%c&&exit"
  9.         )
  10.         timeout 5
  11.     )
  12. popd
  13. )
  14. pause & exit/b
  15. @end
  16. fso = new ActiveXObject("Scripting.FileSystemObject");
  17. foler = fso.GetFolder("./").Name;
  18. while (!WSH.StdIn.AtEndOfStream) {
  19. var f = WSH.StdIn.ReadLine();
  20. Name = f.match(/(.+)\.html/)[1];
  21. var reg = /\d+(?=\s*\)<\/h1>)/,
  22. re = /[^"\/]+(?=_\d+\.html\">下一页<\/a>)/;
  23. s = 'http://www.xxxxx.com/cosplay/img/'+foler+'/';
  24.     str = fso.OpenTextFile(f,1).ReadAll(),
  25.     s1 = reg.test(str)?str.match(reg):'';
  26.     s2 = re.test(str)?str.match(re):'';
  27. var txt ="";
  28.     for(i = 1; i <= s1; i ++) {
  29.     if(i == "1") {
  30.         txt += s+s2+'.jpg\n';
  31.     curl = "curl -o "+s2+".jpg "+s+s2+'.jpg'; //添加curl下载命令,交给%%c下载
  32.             } else {
  33.         txt += s+s2+'_'+i+'.jpg\n';
  34.     curl = "curl -o "+s2+'_'+i+".jpg "+s+s2+'_'+i+'.jpg'; //添加curl下载命令,交给%%c下载
  35.         }
  36.     WSH.echo(curl);//显示内容
  37.     }
  38.     fso.CreateTextFile(Name + ".txt" ,2, true).Write(txt);//保存到提取文件
  39. }
复制代码

TOP

返回列表