标题: [文本处理] 如何批量提取HTML文件h1行,和下一页行,根据特征生成新链接保存为TXT [打印本页]
作者: xp3000 时间: 2023-1-20 17:33 标题: 如何批量提取HTML文件h1行,和下一页行,根据特征生成新链接保存为TXT
有一些HTML文件,例如下面结构:- <!doctype html>
- <html>
- <head>
- …………
- …………
- …………
- <h1>cosplay《尼尔:机械纪元》尤尔哈2B (2 / 11)</h1>
- …………
- …………
- …………
- <a href="1209.html">上一页</a>
- <a href="1209.html">1</a><b>2</b>
- <a href="1209_3.html">3</a>
- <a href="1209_4.html">4</a>
- <a href="1209_5.html">5</a>
- <a href="1209_6.html">6</a>
- <a href="1209_3.html">下一页</a>
- …………
- …………
- …………
- </body>
- </html>
复制代码
提取<h1>行后,获得(2 / 11)内的数值,
数字2表示在第二页,不需要,
数字11表示最大11页,需要提取的就是这个;
提取下一页</a>这一行,获得1209_3.html,
主要是在这里生成,- http://www.xxxxx.com/cosplay/img/1029/1209.jpg
- http://www.xxxxx.com/cosplay/img/1029/1209_2.jpg
- http://www.xxxxx.com/cosplay/img/1029/1209_3.jpg
- http://www.xxxxx.com/cosplay/img/1029/1209_4.jpg
- http://www.xxxxx.com/cosplay/img/1029/1209_5.jpg
- http://www.xxxxx.com/cosplay/img/1029/1209_6.jpg
- http://www.xxxxx.com/cosplay/img/1029/1209_7.jpg
- http://www.xxxxx.com/cosplay/img/1029/1209_8.jpg
- http://www.xxxxx.com/cosplay/img/1029/1209_9.jpg
- http://www.xxxxx.com/cosplay/img/1029/1209_10.jpg
- http://www.xxxxx.com/cosplay/img/1029/1209_11.jpg
复制代码
将生成的jpg链接内容保存为新的文件,和网页文件一致并且在后面添加。TXT
如果<h1>后面的内容是(1 / 1)或没有内容,则不提取- <h1>cosplay《尼尔:机械纪元》尤尔哈2B (1 / 1)</h1>
- <h1>cosplay《尼尔:机械纪元》尤尔哈2B</h1>
复制代码
作者: hlzj88 时间: 2023-1-20 22:17
本帖最后由 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文件,是本地文件还是网络地址可以下载的?
你应该提供样例,描述不是很明白。
作者: xp3000 时间: 2023-1-20 23:50
链接是生成的,也就是1209_3.html
提取第一个()的内容
(\d+)_\d+\.html\">下一页<\/a>
也就是1209
然后拼接,生成http…………jpg链接- @if(0)==(0) echo off
- rem 保存为ANSI编码的BAT文件
-
- for /f "tokens=* delims=" %%a in ('dir /b *.html^|cscript -nologo -e:jscript "%~0"') do (
- echo %%a
- )
- pause & exit/b
- @end
-
- fso = new ActiveXObject("Scripting.FileSystemObject");
- while (!WSH.StdIn.AtEndOfStream) {
- f = WSH.StdIn.ReadLine();
- str = fso.OpenTextFile(f,1).ReadAll();
- s1 = str.match(/<h1>.+\(\d+ \/ ([2-9]|\d{2})\)<\/h1>/)[1];//提取<h1>标题中大于等于2的数字
- if(str == null || s1 == null)continue;
- s2 = str.match(/([0-9]+)_[0-9]+.html\">下一页<\/a>/)[1];//提取x_x.heml字符串_之前的数字
- s3 = 'http://www.xxxxx.com/cosplay/img/'+s2+'/';
- txt = '';
- for(i = 1; i <= s1; i ++) {
- if(i == "1") {
- txt += s3+s2+'.jpg\n';
- } else {
- txt += s3+s2+'_'+i+'.jpg\n';
- }
- }
- WSH.Echo(txt);
- }
复制代码
这个问题是,如果出现下面这种情况会报错- <h1>cosplay《尼尔:机械纪元》尤尔哈2B (1 / 1)</h1>
- <h1>cosplay《尼尔:机械纪元》尤尔哈2B</h1>
复制代码
作者: terse 时间: 2023-1-21 10:23
本帖最后由 terse 于 2023-1-21 10:24 编辑
你自己在加一下判断几个变量值 空的话不执行- var reg = /\d+(?=\s*\)<\/h1>)/,
- re = /[^"]+(?=\">下一页<\/a>)/;
- s = 'http://www.xxxxx.com/cosplay/img/'
- while (!WSH.StdIn.AtEndOfStream) {
- var f = WSH.StdIn.ReadLine(),
- fso = new ActiveXObject("Scripting.FileSystemObject"),
- str = fso.OpenTextFile(f,1).ReadAll(),
- s1 = reg.test(str)?str.match(reg):'';
- s2 = re.test(str)?str.match(re):'';
- WSH.Echo(s,s2,s1);
- }
复制代码
作者: xp3000 时间: 2023-1-21 11:08
我是这样操作的,但是不加try部分还是会提示null,
判断变量等于null为什么跳出循环失败了- @if(0)==(0) echo off
- rem 保存为ANSI编码的BAT文件
-
- for /f "delims=" %%a in ('dir /a:d /b') do (
- pushd "%%a" &echo 进入文件夹下载图片: %~dp0%%a
- for /f "tokens=* delims=" %%b in ('dir /b *.html^|cscript -nologo -e:jscript "%~0"') do (
- echo %%b
- start /I /MIN cmd /k "%%b&&exit"
- timeout 30
- )
- popd
- )
- pause & exit/b
- @end
-
- fso = new ActiveXObject("Scripting.FileSystemObject");
- while (!WSH.StdIn.AtEndOfStream) {
- f = WSH.StdIn.ReadLine();
- Name = f.match(/(.+)\.html/)[1];
- try{
- str = fso.OpenTextFile(f,1).ReadAll();
- s1 = str.match(/<h1>.+\(1 \/ ([2-9]|\d{2})\)<\/h1>/)[1]; //提取<h1>标题中大于等于2的数字
- if ( str == null || s1 == null )continue; //变量null跳出循环,就这里还是提示null
- s2 = str.match(/([0-9]+)_[0-9]+.html/)[1]; //提取x_x.heml字符串_之前的数字
- s3 = 'http://www.xxxxx.com/cosplay/img/'+s2+'/'; //链接地址拼接
-
- txt = '';
- for(i = 1; i <= s1; i ++) {
- if(i == "1") {
- txt += s3+s2+'.jpg\n';
- curl = "curl -o "+s2+".jpg "+s3+s2+'.jpg\n'; //添加curl下载命令,交给%%b下载
- } else {
- txt += s3+s2+'_'+i+'.jpg\n';
- curl = "curl -o "+s2+'_'+i+".jpg "+s3+s2+'_'+i+'.jpg\n'; //添加curl下载命令,交给%%b下载
- }
- WSH.echo(curl);//显示内容
- }
- fso.CreateTextFile(Name + ".txt" ,2, true).Write(txt);//保存到提取文件
- }
- catch(err){}
- }
复制代码
作者: terse 时间: 2023-1-21 11:38
你这样会有匹配不到的情况吧
要不按4楼的正则处理看结果如何 你加一个判断是否匹配到
作者: xp3000 时间: 2023-1-21 18:57
是的,没有(1 / 11)这种格式就提示null,
现在有个问题,有条件没达到,就会输出空文件。- @if(0)==(0) echo off
- rem 保存为ANSI编码的BAT文件
-
- for /f "delims=" %%a in ('dir /a:d /b') do (
- pushd "%%a" &echo 进入文件夹下载图片: %~dp0%%a
- for /f "delims=" %%b in ('dir /b *.html^|findstr /i /v "_[0-9]*.html$"') do (
- for /f "tokens=* delims=" %%c in ('echo %%b^|cscript -nologo -e:jscript "%~0"') do (
- echo %%c
- start /I /MIN cmd /k "%%c&&exit"
- )
- timeout 5
- )
- popd
- )
- pause & exit/b
- @end
-
- fso = new ActiveXObject("Scripting.FileSystemObject");
- foler = fso.GetFolder("./").Name;
-
- while (!WSH.StdIn.AtEndOfStream) {
- var f = WSH.StdIn.ReadLine();
- Name = f.match(/(.+)\.html/)[1];
- var reg = /\d+(?=\s*\)<\/h1>)/,
- re = /[^"\/]+(?=_\d+\.html\">下一页<\/a>)/;
- s = 'http://www.xxxxx.com/cosplay/img/'+foler+'/';
- str = fso.OpenTextFile(f,1).ReadAll(),
- s1 = reg.test(str)?str.match(reg):'';
- s2 = re.test(str)?str.match(re):'';
-
- var txt ="";
- for(i = 1; i <= s1; i ++) {
- if(i == "1") {
- txt += s+s2+'.jpg\n';
- curl = "curl -o "+s2+".jpg "+s+s2+'.jpg'; //添加curl下载命令,交给%%c下载
- } else {
- txt += s+s2+'_'+i+'.jpg\n';
- curl = "curl -o "+s2+'_'+i+".jpg "+s+s2+'_'+i+'.jpg'; //添加curl下载命令,交给%%c下载
- }
- WSH.echo(curl);//显示内容
- }
- fso.CreateTextFile(Name + ".txt" ,2, true).Write(txt);//保存到提取文件
- }
复制代码
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |