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

【练习-071】批处理或VBS获取论坛首页指定数据

本帖最后由 batman 于 2013-1-14 12:31 编辑

出题目的:
    1、体现批处理和VBS脚本的实用性
    2、加深对正则的理解
解题要求:
    1、因纯批处理不能实现读取网页的功能,因此可使用三方工具,但不能在批中调用VBS(使用MSHTA解释器除外)
    2、VBS中不可调用BAT
加分原则:
    满分30分,思路为重,视情况加分
题目如下:
    用VBS或BAT读取论坛首页www.bathome.net源代码中最新主题、最新回复、热门主题的所有帖子信息,并以下面的形式输出到TXT文本
[最新主题]

主题:计算e的值 发帖ID:chineseman2 URL:http://www.bathome.net/thread-21713-1-1.html
..................................................................
[最新回复]

主题:计算e的值 最新回复ID:chineseman2 URL:http://www.bathome.net/thread-21713-1-1.html
..................................................................
[热门主题]

主题:批处理如何删除指定目录下的文件夹? 最新回复ID:terse URL:http://www.bathome.net/thread-21572-1-1.html
..................................................................
***共同提高***

tmplinshi 发表于 2013-1-19 15:36

抛个砖 引来版主之玉 研究下 SED 正则

TOP

本帖最后由 tmplinshi 于 2013-1-19 16:01 编辑
  1. curl bathome.net | sed -n -r "s|^.*homegrids_t_[123]\x22>([^\n\r<]+).*$|[\1]|p; s|(<li>[^?]+\?)(uid[^>]+>)|\1发帖ID:|g; s|(<li>[^?]+\?)(username[^>]+>)|\1最新回复:|g; s|<li>[^?]+\?([^<]+)[^']+'([^']+)'[^']+'([^']+)[^<]+</a></li>|主题:\3 \1 URL:http://bathome.net/\2\n|gp" >bathome.txt
复制代码

TOP

搞个三方的 练手 SED 还是有点生疏
  1. @ECHO OFF
  2. set url="http://bbs.bathome.net/"
  3. set s1=最新主题&set "s2=热门主题|最新回复"
  4. set "s=s/<[^\/]*'>([^\/]*)<[^']*'([^']*)'[^<]*'>([^<]*)<\/a><\/li>"
  5. curl -s "%URL%"|sed -r -n "/%s1%|%s2%/!d;s/<[^<]*>//g;s/\r|\n//;s/^/[/;s/$/]/;N;/%s1%/%s%/主题:\3\t发帖ID:\1\tURL: %URL:/=\/%\2\n/g;/%s2%/%s%/主题:\3\t最新回复:\1\tURL:%URL:/=\/%\2\n/g;p" >Rult.txt
  6. pause
复制代码

TOP

额 恶补
  1. set ie = createobject("internetexplorer.application")
  2. ie.visible = false
  3. ie.navigate "http://www.bathome.net"
  4. do until ie.readystate = 4
  5. wscript.sleep 200
  6. loop
  7. Set FSO=CreateObject("Scripting.FilesystemObject")
  8. DIM N,S,var
  9. for i = 0 to 47 step 2
  10.       N = i \ 16
  11.       if i MOD 16 = 0 Then
  12.          var = var & "[" & ie.document.getElementById("homegrids_t_" & N + 1).outerText & "]" & vbcr & vblf
  13.       End If
  14.       if N <> 0 Then
  15.            Str = "主题:" & ie.document.links(i+28).innertext & " " & "最新回复:"
  16.            ELSE Str = "主题:" & ie.document.links(i+28).innertext & " " &"发帖ID:"
  17.       End If
  18.       var= var & str & ie.document.links(i+27).outerText & " " & "URL:" & ie.document.links(i+28).href & vbcr & vblf
  19. Next
  20. FSO.OpenTextFile("Rult.txt",2,True).WriteLine var
  21. ie.quit
  22. Set ie = Nothing
复制代码
1

评分人数

    • batman: 学习了,不过ie确实不通用PB + 28

TOP

回复 15# batman

牙口不好...估计咬不动....

同样是第三方, 我用exe也是下载  用vbs也是下载....
都是把网页下载成txt么....
然后再处理~   这个和出题目的不相悖吧....

TOP

本帖最后由 batman 于 2013-1-15 01:19 编辑

回复 14# bluewing009


    一答:
       我摆明了就是不让你用批处理echo神功大*法(这也屏蔽),怎么着?咬我?
***共同提高***

TOP

本帖最后由 bluewing009 于 2013-1-15 00:58 编辑

一问:
bat既然无法实现网页的下载,那么我借用vbs实现可否?
vbs只是下载网页~
这样就与你“但不能在批中调用VBS”冲突了......

对要求1 不解》。。。

TOP

本人的解:
  1. Dim objXML, Url
  2. Url = "http://www.bathome.net"
  3. Set objXML = CreateObject("MSXML2.XmlHttp")
  4. objXML.open "GET", Url, False
  5. objXML.send()
  6. Do Until objXML.readyState = 4 : WScript.Sleep 200 : Loop
  7. Dim objADODB
  8. Set objADODB = CreateObject("Adodb.Stream")
  9. objADODB.Type = 1
  10. objADODB.Mode = 3
  11. objADODB.Open()
  12. objADODB.Write objXML.responseBody
  13. Set objXML = Nothing
  14. Dim objFSO, Temp
  15. Set objFSO = CreateObject("Scripting.FileSystemObject")
  16. Temp = objFSO.GetSpecialFolder(2) & "\"
  17. objADODB.SaveToFile Temp & "bathome.html", 2
  18. Set objADODB = Nothing
  19. Dim objHTML, objIH
  20. Set objHTML = GetObject(Temp & "bathome.html", "HtmlFile")
  21. Do Until objHTML.ReadyState = "complete" : WScript.Sleep 200 : Loop
  22. Dim A, B, objStr
  23. A = Array("最新主题", "最新回复", "热门主题")
  24. B = Array("发帖ID:", "最新回复ID:", "最新回复ID:")
  25. For i = 1 To 3
  26.   objIH = objHTML.GetElementByID("homegrids_c_" & i).InnerHtml
  27.   objStr = objStr & "["& A(i - 1) & "]" & vbCrLf & GetInfo(objIH, B(i - 1)) & vbCrLf
  28. Next
  29. Set objHTML = Nothing
  30. objFSO.DeleteFile Temp & "bathome.html"
  31. objStr = Replace(objStr, "<UL class=textinfolist>" & vbCrLf, "")
  32. objFSO.OpenTextFile("HomePage.txt", 2, True).Write Replace(objStr, vbLf, vbCrLf)
  33. Set objFSO = Nothing
  34. CreateObject("Wscript.Shell").Run "cmd /chomepage.txt", True, False
  35. Function GetInfo(Str1, Str2)
  36.   Dim objRE, Matches, Matche
  37.   Set objRE = New RegExp
  38.   objRE.Global = True
  39.   objRE.IgnoreCase = True
  40.   objRE.Pattern = ".*?"">(.*?)</a.*?(\d{1,}-\d{1,}-\d{1,}).*?"">(.*?)</a.*"
  41.   GetInfo = objRE.Replace(Str1, "主题:$3 " & Str2 & "$1 URL:" & Url & "/thread-$2.html")
  42.   Set objRE = Nothing
  43. End Function
复制代码
***共同提高***

TOP

TOP

本帖最后由 batman 于 2013-1-14 23:56 编辑

回复 9# 冷玉公子


    我一没curl二没wget(个人不喜欢用三方),所以没测试你们的代码,我是看你们的代码加的分。。。
   
   批中findstr支持正则啊
***共同提高***

TOP

回复 8# apang


    分已加上,正则用得很好,只是能不用IE就Perfect了,IE你懂的。。。
***共同提高***

TOP

回复 7# batman


    老大,4楼那哥们的是有问题的吧。
    还有啊,老大给个批处理用正则的例子吧,难道要用 Sed 或者 Awk?

TOP

回复 6# batman


    老大,不是我故意的,是理解题意错了。。。
修改了,这次不知怎样。

TOP

希望大家多用用正则来解决这类提取数据的问题
***共同提高***

TOP

返回列表