Board logo

标题: [文本处理] 批处理如何从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 编辑
  1. @if(0)==(0) echo off& cscript.exe -nologo -e:jscript "%~f0"&pause&exit/b&@end
  2. var aso = new ActiveXObject("ADODB.Stream");
  3. aso.Mode = 3;
  4. aso.Type = 2;
  5. aso.Charset = "utf-8";
  6. aso.Open();
  7. aso.LoadFromFile("1.htm");
  8. var txt = aso.ReadText(-1);
  9. var reg = /\{"qid":.+?"answer":"([^"]+)"\}/g
  10. var rs = txt.match(reg);
  11. txt = "";
  12. for(var i=0; i<rs.length; i++){
  13. reg = /\{"qid":(\d+),.+?(?="title)"title":"([^"&]+).*?","content":"(A、[^&]*).*?(B、[^&]*).*?(C、[^&]*).*?(D、[^\\]*).*?","optionnum":4,"answer":"([^"]+)"\}/g
  14. if(reg.test(rs[i]))
  15. txt+=RegExp.$1 //qid
  16. + "," + RegExp.$2 //title
  17. + "," + RegExp.$3 //A
  18. + "," + RegExp.$4 //B
  19. + "," + RegExp.$5 //C
  20. + "," + RegExp.$6 //D
  21. + "," + RegExp.$7 //answer
  22. + "\r\n";
  23. }
  24. aso.Position = 0;
  25. aso.WriteText(txt);
  26. aso.SetEOS();
  27. aso.SaveToFile("结果.txt", 2);
  28. aso.Close();
  29. 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 编辑
  1. //&cls&dir /b "1.htm"|cscript.exe -nologo -e:jscript "%~f0"&pause&exit/b
  2. var loadText = function (FileIn,Charset){
  3.     var stm = new ActiveXObject('ADODB.Stream');
  4.     stm.Type = 2;
  5.     stm.Mode = 3;
  6.     stm.Charset = Charset;
  7.     stm.Open();
  8.     stm.LoadFromFile(FileIn);
  9.     stm.Position = 0;
  10.     return stm.ReadText;
  11. }
  12. var saveText = function (str,FileOut,Charset){
  13.     var stm = new ActiveXObject('ADODB.Stream');
  14.     stm.Type = 2;
  15.     stm.Mode = 3;
  16.     stm.Charset = Charset;
  17.     stm.Open();
  18.     stm.WriteText(str);
  19.     return stm.SaveToFile(FileOut,2);
  20. }
  21. while(!WScript.StdIn.AtEndOfStream) {
  22.     var txt = '';
  23.     var f= WScript.StdIn.ReadLine();
  24.     var fn = f.replace(/\.[^\.]*$/,'');
  25.     var txttmp = loadText(f,'utf-8').match(/\[\{"qid":.+?\}\]/)[0];
  26.     var txttmp = txttmp.replace(/&lt;/g,'「').replace(/&gt;/g,'」').replace(/「[^」]*」|\\\\r|\\\\n/g,'');
  27.     var m = txttmp.match(/\{[^\}]+?\}/g);
  28.     for (var i=0;i<m.length;i++){
  29.         var qid = m[i].replace(/.+"qid":(\d+).+/,'$1');
  30.         var title = m[i].replace(/.+?"title":"(.+)","content.+/,'$1');
  31.         var content = m[i].replace(/.+?"content":"(.+)","optionnum.+/,'$1').replace(/\\n|\\t/g,'');
  32.         var content = content.replace(/(B、|C、|D、)/g,'\r\n$1');
  33.         var answer = '答案:'+m[i].replace(/.+?answer":"([^"]).+/,'$1');
  34.         txt +=qid+'、'+title+'\r\n'+content+'\r\n'+answer+'\r\n\r\n'
  35.     }
  36.     saveText(txt,fn+'.txt','gb2312');
  37. }
复制代码





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