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

批处理提取网页中《西游记》原文

[复制链接]
 楼主| 发表于 2011-4-29 19:47:51 | 显示全部楼层
15# powerbat
本题最难点在于去除局部重复内容,以我对vbs的了解,它表示压力很大。。。
发表于 2011-4-29 20:17:15 | 显示全部楼层
16# batman


如果不追求节省资源+效率,可以一边写入文件,然后下一句开始findstr文本。
发表于 2011-4-29 20:29:42 | 显示全部楼层
试过用IE打开网站,读缓存,但是几个问题很麻烦。
主要问题是IE打开的速度有快有慢,很难知道IE有没有将网页完全下载,除非设置较长的延时,或者等待端口time out(也很久)。

找到对应的缓存文件的方法如下:
1, ping 得到IP。
2,REG方式得到缓存主目录。
3,start web
4,在缓存主目录里,dir /s /b /ad /od /tw 得到最近访问时间的缓存文件夹。
5,netstat -o |findstr "IP"得到“PID”,然后tasklist 取得IE窗口“TITLE”。
6,进入缓存文件夹,findstr /i "<title>.*%Title%" *,查找缓存文件。

还是用NC,WGET要容易的多。

评分

参与人数 1技术 +1 收起 理由
taofan712 + 1 妙!!

查看全部评分

 楼主| 发表于 2011-4-29 20:34:50 | 显示全部楼层
18# caruko
是不是想得太复杂了。。。
发表于 2011-4-29 20:38:39 | 显示全部楼层
如果似乎给定的网站,那么TITIE,缓存文件都是固定的。
就可以直接就找到了。
发表于 2011-4-29 21:04:53 | 显示全部楼层
楼上的同学走得太绕了
发表于 2011-4-29 22:22:36 | 显示全部楼层
本帖最后由 zm900612 于 2011-4-29 22:24 编辑

这个vbs部分是照搬别人的...
  1. @echo off&setlocal enabledelayedexpansion
  2. more>1.vbs +16 %0
  3. wscript //nologo 1.vbs "http://bbs.tt365.net.cn/viewthread.php?tid=161145" 1.htm
  4. (for /f "delims=" %%a in ('findstr /rc:"【.*】" 1.htm') do (
  5.         set str=%%a【
  6.         for /l %%b in (1 1 100) do (
  7.                 if "!str!" neq " " for /f "tokens=1* delims=】" %%c in ("!str:*【=!") do (
  8.                         if not defined .%%c (
  9.                                 set .%%c=.
  10.                                 echo %%c
  11.                         )
  12.                 )
  13.         )
  14. ))>3.txt
  15. pause&exit

  16. iLocal=LCase(Wscript.Arguments(1))
  17. iRemote=LCase(Wscript.Arguments(0))
  18. Set xPost=createObject("Microsoft.XMLHTTP")
  19. xPost.Open "GET",iRemote,0
  20. xPost.Send()
  21. set sGet=createObject("ADODB.Stream")
  22. sGet.Mode=3
  23. sGet.Type=1
  24. sGet.Open()
  25. sGet.Write xPost.ResponseBody
  26. sGet.SaveToFile iLocal,2
复制代码
 楼主| 发表于 2011-4-29 23:19:29 | 显示全部楼层
22# zm900612
效率我不评论,提取的文字少了n行。。。
发表于 2011-4-29 23:23:28 | 显示全部楼层
23# batman


效率低的是vbs部分,那部分我没有一点办法,bat部分可以通过调整for /l循环数来控制用时。至于漏行,我去调试一下吧...
发表于 2011-4-29 23:52:24 | 显示全部楼层
【悟空道:“但凭尊师教诲,只是有些道气儿,弟子便就学了。”】与【只是有些道气儿】
如果短句子在前面呢?怎么处理?
 楼主| 发表于 2011-4-30 00:58:15 | 显示全部楼层
25# powerbat
可不视为重复。。。
发表于 2011-4-30 09:24:37 | 显示全部楼层
vbs

  1. Set fso = CreateObject("Scripting.FileSystemObject")
  2. Set dict = CreateObject("Scripting.Dictionary")

  3. downloader "http://bbs.tt365.net.cn/viewthread.php?tid=161145", "E:\test\aaa.htm"

  4. Set oDOM = GetObject("E:\test\aaa.htm", "htmlfile")
  5. Do Until oDOM.readyState="complete" : WScript.Sleep 200 : Loop 'complete
  6. Set tags = oDOM.getElementsByTagName("td")
  7. for each tag in tags
  8.     if 1=InStr(tag.Id,"postmessage_") then
  9.         'WScript.echo tag.innerText
  10.         StrStrReg tag.innerText, "【([^【】]+)】"
  11.     end if
  12. next

  13. Set ts = fso.OpenTextFile("result.txt", 2, true)
  14. for each key in dict.Keys()
  15.     'WScript.echo key
  16.     ts.WriteLine key
  17. next
  18. ts.Close()

  19. function downloader(url, file)
  20.   dim XMLHTTP, AdoStrm
  21.   Set XMLHTTP = CreateObject("Microsoft.XMLHTTP")
  22.   XMLHTTP.Open "GET", url, false
  23.   XMLHTTP.Send()
  24.   set AdoStrm = CreateObject("ADODB.Stream")
  25.   AdoStrm.Mode = 3
  26.   AdoStrm.Type = 1
  27.   AdoStrm.Open()
  28.   AdoStrm.Write XMLHTTP.ResponseBody
  29.   AdoStrm.SaveToFile file, 2
  30. end function

  31. function StrStrReg(srcStr, subStr)
  32.   dim regEx, Matches, Match, ret
  33.   set regEx = CreateObject("VBScript.RegExp")
  34.   regEx.Pattern = subStr
  35.   regEx.Global = true
  36.   regEx.IgnoreCase = false
  37.   set Matches = regEx.execute(srcStr)
  38.   for each Match in Matches
  39.     'ret = ret & Match.subMatches(0) & vbCrLf
  40.     Catch Match.subMatches(0)
  41.   next
  42.   StrStrReg = ret
  43. end function

  44. function Catch(txt)
  45.   for each key in dict.Keys()
  46.     if InStr(key,txt) then exit function
  47.   next
  48.   dict.Add txt, 1
  49. end function
复制代码

评分

参与人数 1PB +20 收起 理由
batman + 20 没想到vbs正则真的做到了

查看全部评分

发表于 2011-4-30 10:58:19 | 显示全部楼层
本帖最后由 zm900612 于 2011-4-30 12:53 编辑

昨天漏了set str=%%b以便重新进入循环,而且没注意要将长句分段判断是否重复的要求,重写了下
batman说我代码效率很低,其实bat部分是冤枉的,我一向比较关心算法的效率,特别慢的算法好意思拿出来吗?这种小文件还不至于太卡,大文件才可能有明显的减速,主要是vbs下载用时太长...
  1. @echo off&setlocal enabledelayedexpansion
  2. echo %time% 开始下载
  3. more>1.vbs +22 %0
  4. wscript //nologo 1.vbs "http://bbs.tt365.net.cn/viewthread.php?tid=161145" a.htm
  5. echo %time% 下载完成
  6. (for /f "delims=" %%a in ('findstr /rc:"【.*】" a.htm') do (
  7.         set str=%%a【
  8.         for /l %%b in (1 1 10) do (
  9.                 if "!str!" neq "" for /f "tokens=1* delims=】" %%c in ("!str:*【=!") do (
  10.                         if "!.%%c!"=="" (
  11.                                 set tmp=%%c
  12.                                 for %%e in (, 。 “ ” ; : ? !) do set tmp=!tmp:%%e=","!
  13.                                 for %%e in ("!tmp!") do set .%%~e=.
  14.                                 set .%%c=.
  15.                                 echo %%c
  16.                         )
  17.                         set str=%%d
  18.                 )
  19.         )
  20. ))>a.txt
  21. echo 处理完成 %time%
  22. pause&exit

  23. iLocal=LCase(Wscript.Arguments(1))
  24. iRemote=LCase(Wscript.Arguments(0))
  25. Set xPost=createObject("Microsoft.XMLHTTP")
  26. xPost.Open "GET",iRemote,0
  27. xPost.Send()
  28. set sGet=createObject("ADODB.Stream")
  29. sGet.Mode=3
  30. sGet.Type=1
  31. sGet.Open()
  32. sGet.Write xPost.ResponseBody
  33. sGet.SaveToFile iLocal,2
复制代码
more的行数差了两行,改下

评分

参与人数 1PB +20 收起 理由
batman + 20 小学还要进修下

查看全部评分

 楼主| 发表于 2011-4-30 12:22:21 | 显示全部楼层
28# zm900612
兄弟算法ok,算术不ok。。。
发表于 2011-4-30 12:45:49 | 显示全部楼层
29# batman


汗,加了那三条echo,忘了改more相应的参数
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-17 00:48 , Processed in 0.021940 second(s), 7 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表