[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

【练习-054】用批处理选择性解析网页代码

出题目的:
    综合考查大家对文本的处理能力
加分原则:
    满分20分,视情况加分(以思路为重)
解题要求:
    代码高效、简洁、不生成临时文件
    另请技术组和管理层暂缓解题
题目如下:
    本人将论坛网页(我的评分)的一页源码复制到了a.txt(见附件),要求用批处理获取里面的被评分者、评分时间、
积分变动、评分理由信息,并生成b.txt如下(b.txt中所有信息都是从网页中获取的):
  1. 被评分者 评分时间 积分变动 评分理由
  2. chenxin 09-12-10-12:27 PB-20 恶意编辑
  3. chenxin 09-12-10-12:27 PB-20 恶意编辑
  4. chenxin 09-12-10-12:26 PB-20 恶意编辑
  5. chenxin 09-12-10-12:26 PB-20 恶意编辑
  6. chenxin 09-12-10-12:26 PB-20 恶意编辑
  7. chenxin 09-12-10-12:26 PB-20 恶意编辑
  8. chenxin 09-12-10-12:25 PB-20 恶意编辑
  9. chenxin 09-12-10-12:25 PB-20 恶意编辑贴子
  10. bat_fan 09-12-10-09:59 PB+5 感谢分享
  11. neorobin 09-12-9-15:25 PB+5 感谢分享
  12. 3Q3Q 09-12-9-10:47 PB-3 擅自修改标题并在标题上直呼人名
  13. ljs4r 09-12-6-21:02 PB+2 感谢主动给标题标注[已解决]字样
  14. ljs4r 09-12-4-09:05 PB+2 感谢主动给标题标注[已解决]字样
  15. neorobin 09-12-3-08:49 技术+1 好规范的代码
  16. neorobin 09-12-3-08:49 PB+20 好规范的代码
  17. summerflower 09-11-30-12:25 PB+2 感谢主动给标题标注[已解决]字样
  18. zjw767676 09-11-29-17:39 PB+5 说得对,论坛禁灌水
  19. canyue 09-11-29-16:00 PB+2 感谢主动给标题标注[已解决]字样
  20. summerflower 09-11-29-15:31 PB+2 感谢主动给标题标注[已解决]字样
  21. terse 09-11-29-10:53 PB+40 好,只是晚到了点
复制代码
完成了上一步的可以提高难度,要求获取被评分者 帖子内容预览 评分者 评分时间 积分变动 评分理由信息,并生成b.txt如下:
  1. 被评分者 帖子内容预览 评分者 评分时间 积分变动 评分理由
  2. chenxin http://bbs.bathome.net/thread-6566-1-1.html batman 09-12-10-12:27 PB-20 恶意编辑
  3. chenxin http://bbs.bathome.net/thread-6566-1-1.html batman 09-12-10-12:27 PB-20 恶意编辑
  4. chenxin http://bbs.bathome.net/thread-6432-1-1.html batman 09-12-10-12:26 PB-20 恶意编辑
  5. chenxin http://bbs.bathome.net/thread-6432-1-1.html batman 09-12-10-12:26 PB-20 恶意编辑
  6. chenxin http://bbs.bathome.net/thread-6432-1-1.html batman 09-12-10-12:26 PB-20 恶意编辑
  7. chenxin http://bbs.bathome.net/thread-6432-1-1.html batman 09-12-10-12:26 PB-20 恶意编辑
  8. chenxin http://bbs.bathome.net/thread-6432-1-1.html batman 09-12-10-12:25 PB-20 恶意编辑
  9. chenxin http://bbs.bathome.net/thread-6432-1-1.html batman 09-12-10-12:25 PB-20 恶意编辑贴子
  10. bat_fan http://bbs.bathome.net/thread-6627-1-1.html batman 09-12-10-09:59 PB+5 感谢分享
  11. neorobin http://bbs.bathome.net/thread-6655-1-1.html batman 09-12-9-15:25 PB+5 感谢分享
  12. 3Q3Q http://bbs.bathome.net/thread-6633-1-1.html batman 09-12-9-10:47 PB-3 擅自修改标题并在标题上直呼人名
  13. ljs4r http://bbs.bathome.net/thread-6625-1-1.html batman 09-12-6-21:02 PB+2 感谢主动给标题标注[已解决]字样
  14. ljs4r http://bbs.bathome.net/thread-6602-1-1.html batman 09-12-4-09:05 PB+2 感谢主动给标题标注[已解决]字样
  15. neorobin http://bbs.bathome.net/thread-6592-1-1.html batman 09-12-3-08:49 技术+1 好规范的代码
  16. neorobin http://bbs.bathome.net/thread-6592-1-1.html batman 09-12-3-08:49 PB+20 好规范的代码
  17. summerflower http://bbs.bathome.net/thread-6541-1-1.html batman 09-11-30-12:25 PB+2 感谢主动给标题标注[已解决]字样
  18. zjw767676 http://bbs.bathome.net/thread-6482-1-1.html batman 09-11-29-17:39 PB+5 说得对,论坛禁灌水
  19. canyue http://bbs.bathome.net/thread-6534-1-1.html batman 09-11-29-16:00 PB+2 感谢主动给标题标注[已解决]字样
  20. summerflower http://bbs.bathome.net/thread-6531-1-1.html batman 09-11-29-15:31 PB+2 感谢主动给标题标注[已解决]字样
  21. terse http://bbs.bathome.net/thread-6467-1-1.html batman 09-11-29-10:53 PB+40 好,只是晚到了点
复制代码
注:http://bbs.bathome.net/这部分可自行加上去,计分同时提高到30分。
链接: https://pan.baidu.com/s/1t4QIOnDCEPgmGmULIjdOug 提取码: nvqt
***共同提高***

回复 3楼 的帖子

1、结果肯定不是很正确,时间的输出格式是09-12-4-09:05,PB的输出应该是PB+5式样(都要处理其中的空格)。

2、我在顶楼要求b.txt中所有信息都要从网页源码中获取,即你并不知道要提取的信息具体内容,所以echo 被评分者 评分时间 积分
变动 评分理由>b.txt有点投机了。

3、效率上是存在着一定的问题,具体也不多说了。

4、总之完成的还可以,继续加油!
***共同提高***

TOP

回复 2楼 的帖子

if !l! EQU 1 set/p=%%x%%y <nul  else ( 这是什么语法?

另结果不正确。。。
***共同提高***

TOP

&&我之所以在顶楼要求技术组和管理层暂不解题,就是想留给大家更多独立思考的时间,所以请大家都动脑想一想,动手练一练,

同时这样的问题你们在现实中是很有可能遇到的,只要独立解出了此题,相信以后你们碰到同样的问题,处理起来一定会得手应手。
***共同提高***

TOP

回复 7楼 的帖子

依我的理解,应该不会出现兄弟这样的情况,不知兄弟用的是什么方法,逐行判断处理?
***共同提高***

TOP

做点小小的提示:

    1、充分利用findstr的正则来解题。

    2、尽量采用一次性读取和输出以提高效率,即读取和输出同时进行。

    3、在获取链接地址时注意处理引号技巧的运用。
***共同提高***

TOP

回复 13楼 的帖子

1、论坛是不能处理tab的,所以贴出带有tab的代码时,最好要说明下哪些空格实际上tab。

2、echo 被评分者        评分时间        积分变动   评分理由违反题意。

3、既然开了变量延迟为什么还要用call,这样会代码运行影响效率。

4、时间中的空格没有处理好。

5、这种长变量的方法很好,思路好。
***共同提高***

TOP

回复 12楼 的帖子

之所以看不出你上下两段代码的效率的区别,我想原因有二:

1、你12楼的代码中有大量的冗余操作,导致代码效率降低。

2、处理的数据量不是很大,所以在时间比较上看不出太大的差别。
***共同提高***

TOP

&&看来此题对于普通会员来说具有一定的难度,下面给出本人的全解,并稍做说明,代码如下:
  1. @echo off&setlocal enabledelayedexpansion
  2. (for /f "delims=" %%a in ('findstr /r "<b>< <td.*d>$" a.txt') do (
  3.     set /a n+=1&if !n! equ 6 set /a n=1,m=0&echo.
  4.     if not defined m (
  5.        for /f "tokens=3,4 delims=/<>" %%b in ("%%a") do set /p=%%b <nul&if !n! equ 3 set /p=%%c <nul
  6.        ) else (
  7.        if !n! equ 1 for /f "tokens=4 delims=<>" %%b in ("%%a") do set /p=%%b <nul
  8.        if !n! equ 2 for /f "tokens=8 delims== " %%b in ("%%a") do set /p=http://bbs.bathome.net/%%~b <nul
  9.        if !n! equ 3 for /f "tokens=8,12,13 delims=<> " %%b in ("%%a") do set /p=%%b %%c-%%d <nul
  10.        if !n! equ 4 for /f "tokens=4,7 delims=<> " %%b in ("%%a") do set /p=%%b%%c <nul
  11.        if !n! equ 5 for /f "tokens=3 delims=<>" %%b in ("%%a") do set /p=%%b <nul
  12.     )
  13. ))>b.txt
  14. start b.txt
复制代码
说明:
    首先讲讲findstr正则的运用,大家都明白代码中运用findstr是为了最大限度地从a.txt中剔除无用信息行而提取有用信息行,所以

代码中使用了findstr /r "<b>< <td.*d>$" a.txt,之所以使用/r参数是为了让findstr识别后面的<td.*d>$表达式而不是全做为字符来处理

其中的$表示行尾,使用<b><的表达式的意思大家都知道我就不说明了,使用<td.*d>$表达式就可以提取所有含有<td字符并从中剔

除只以<td>结尾的行。

    接下来讲下代码中for /f "tokens=* delims=*"的运用,使用findstr正则提取了有用信息行后,接下来我们还要从每行中剔除无用

的信息,而保留输出想要的信息,一般来说可以采用两种办法,一种是字符截取,但因为文本中的字符数是在变化的,所以此法不

可用,那么我们就要利用好for /f中的tokens和delims参数了,先选取合适的足够的分隔符来将每行分成n列,注意在分隔时不要将

我们想要获取的字符部分分开了,同时尽量取特殊字符为分隔符而不要取常用的数字和字母,最后取我们所需要的列并输出就可以

了。

   看了13楼的长变量法(将每五行存入一个变量),我也尝试过用此法来解析出全信息,但实际上处理起来相当麻烦,希望有高人

能给出此法的精彩代码。
***共同提高***

TOP

回复 18楼 的帖子

看了你的代码,我也着实郁闷,你处理得太复杂了吧,后面的结果根本不对。。。
***共同提高***

TOP

回复 20楼 的帖子

像这种逐行(实际上不是每行)skip的方法,效率是最大的问题,如果有10000组数据要处理,那岂不是要用for

对文本读取10000次,还有被评者是在每组第一行的,请问用这种skip方法如何得到?就是经处理得到后,还不是

一样要处理滤过每组的第二行?再说了对空格的处理直接用delims不就行了,还要搞什么退格?
***共同提高***

TOP

回复 24楼 的帖子

我所说的大变量法在前面16楼已经说明了,但要求比我16楼的代码还要简洁,目前苦无突破。。。
***共同提高***

TOP

返回列表