标题: [文本处理] 批处理如何从html中提取出指定的几段内容? [打印本页]
作者: yiweipiaoxu 时间: 2015-9-8 11:39 标题: 批处理如何从html中提取出指定的几段内容?
如题,该html是某在线考试系统保存得到的,其中含有160道选择题和答案选项,想要从中将题目和答案提取出来,需要提取的包括以下几部分内容:
1、“qid”字段后的数字是题目的编号,分别是从1-160,需要提取。
2、“tittle”字段后的内容是该道题的题目内容。
3、“content”字段后的内容是答案选项,即A、B、C、D和文字内容。
4、“answer”字段后的内容是答案,只有一个字母。
现在想把这几部分内容提取后生成为新的txt文件,这四项内容之间分别用逗号隔开(其实最终目的是放到excel里,方便在电脑本地做题或者打印出来),因html文本中符号太多,且代码的换行也不规范,本人半桶水用for指令写了很多条命令都没成功,请求坛里大神指导,感谢!
附件如下(已将附件替换为原始html文件):
作者: pcl_test 时间: 2015-9-8 11:53
原件更利于解决问题,可发压缩包或是网盘分享链接
作者: yiweipiaoxu 时间: 2015-9-8 11:58
回复 2# pcl_test
您好,已经将附件替换了,麻烦您看看,谢谢!
作者: 回家路上 时间: 2015-9-8 13:50
本帖最后由 回家路上 于 2015-9-8 15:37 编辑
- @if(0)==(0) echo off& cscript.exe -nologo -e:jscript "%~f0"&pause&exit/b&@end
-
- var aso = new ActiveXObject("ADODB.Stream");
- aso.Mode = 3;
- aso.Type = 2;
- aso.Charset = "utf-8";
- aso.Open();
- aso.LoadFromFile("1.htm");
- var txt = aso.ReadText(-1);
- var reg = /\{"qid":.+?"answer":"([^"]+)"\}/g
- var rs = txt.match(reg);
- txt = "";
- for(var i=0; i<rs.length; i++){
- reg = /\{"qid":(\d+),.+?(?="title)"title":"([^"&]+).*?","content":"(A、[^&]*).*?(B、[^&]*).*?(C、[^&]*).*?(D、[^\\]*).*?","optionnum":4,"answer":"([^"]+)"\}/g
- if(reg.test(rs[i]))
- txt+=RegExp.$1 //qid
- + "," + RegExp.$2 //title
- + "," + RegExp.$3 //A
- + "," + RegExp.$4 //B
- + "," + RegExp.$5 //C
- + "," + RegExp.$6 //D
- + "," + RegExp.$7 //answer
- + "\r\n";
- }
- aso.Position = 0;
- aso.WriteText(txt);
- aso.SetEOS();
- aso.SaveToFile("结果.txt", 2);
- aso.Close();
- aso = null;
复制代码
作者: yiweipiaoxu 时间: 2015-9-8 15:04
回复 4# 回家路上
大神啊,太厉害了,已经测试通过。第一次来发帖就有热心人帮忙,着实感动。之前自己只能写一些简单的批处理,稍微复杂点的就上网找功能近似的慢慢看懂再修改。条件判断方面我懂的还太少还要下点功夫研究,这段代码我会用心琢磨透,再次感谢帮忙的朋友!
作者: yiweipiaoxu 时间: 2015-9-8 15:24
回复 4# 回家路上
测试后还发现一个小问题,html里有160道题,实际生成的“结果.txt”里只有157道题,有3道没有成功导出,能否解答一下是什么原因造成的?(从158题开始就跟识图有关了,题目带有图片的链接地址,是否与此有关?若让程序跳过图片,其余文字继续提取,这个批处理该怎么改)
作者: 回家路上 时间: 2015-9-8 15:37
回复 6# yiweipiaoxu
已修改
作者: pcl_test 时间: 2015-9-8 17:16
本帖最后由 pcl_test 于 2015-9-9 11:38 编辑
- //&cls&dir /b "1.htm"|cscript.exe -nologo -e:jscript "%~f0"&pause&exit/b
-
- var loadText = function (FileIn,Charset){
- var stm = new ActiveXObject('ADODB.Stream');
- stm.Type = 2;
- stm.Mode = 3;
- stm.Charset = Charset;
- stm.Open();
- stm.LoadFromFile(FileIn);
- stm.Position = 0;
- return stm.ReadText;
- }
- var saveText = function (str,FileOut,Charset){
- var stm = new ActiveXObject('ADODB.Stream');
- stm.Type = 2;
- stm.Mode = 3;
- stm.Charset = Charset;
- stm.Open();
- stm.WriteText(str);
- return stm.SaveToFile(FileOut,2);
- }
-
- while(!WScript.StdIn.AtEndOfStream) {
- var txt = '';
- var f= WScript.StdIn.ReadLine();
- var fn = f.replace(/\.[^\.]*$/,'');
- var txttmp = loadText(f,'utf-8').match(/\[\{"qid":.+?\}\]/)[0];
- var txttmp = txttmp.replace(/</g,'「').replace(/>/g,'」').replace(/「[^」]*」|\\\\r|\\\\n/g,'');
- var m = txttmp.match(/\{[^\}]+?\}/g);
- for (var i=0;i<m.length;i++){
- var qid = m[i].replace(/.+"qid":(\d+).+/,'$1');
- var title = m[i].replace(/.+?"title":"(.+)","content.+/,'$1');
- var content = m[i].replace(/.+?"content":"(.+)","optionnum.+/,'$1').replace(/\\n|\\t/g,'');
- var content = content.replace(/(B、|C、|D、)/g,'\r\n$1');
- var answer = '答案:'+m[i].replace(/.+?answer":"([^"]).+/,'$1');
- txt +=qid+'、'+title+'\r\n'+content+'\r\n'+answer+'\r\n\r\n'
- }
- saveText(txt,fn+'.txt','gb2312');
- }
复制代码
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |