Board logo

标题: [文本处理] [已解决]批处理如何截取网页中固定内容到新的文本?谢谢。 [打印本页]

作者: hijackle    时间: 2012-12-28 08:09     标题: [已解决]批处理如何截取网页中固定内容到新的文本?谢谢。

如附件,如何获取网页中的“编码”“名称”“电话”“数量1”“数量2”“时间”“时长”“原因”的具体数值到新的文本中并自动换行,网页实际有多少行这样的数据未知也就是不止这个网页的只有4行

020033  分店1  13888888888(王大狗)  115  105  2012-12-28 06:12:52 0天0小时19分钟 异常  
020042  分店2  1366666666、88999999  92  84  2012-11-21 12:11:17 24天3小时35分钟 盗版  
020064  分店3  5555555\13000000000  0  0  2012-12-28 06:12:42 0天0小时17分钟 过低  
020085  分店4  15333333333/444444444  63  56  2012-05-15 12:05:57 150天19小时21分钟 关闭
作者: batman    时间: 2012-12-28 22:30

本帖最后由 batman 于 2012-12-28 22:31 编辑

用vbs正则:
  1. Dim FSO, redStr, Arr, vbStr
  2. Set FSO = CreateObject("Scripting.FileSystemObject")
  3. redStr = FSO.OpenTextFile("test.html").ReadAll
  4. Arr = Split(GetText(redStr), "分钟")
  5. For Each str In Arr
  6.   str = Replace(str, vbCrLf, "")
  7.   For Each var In Split(str, " ")
  8.     If Replace(var, " ", "") <> "" Then
  9.       If Mid(var,3,1) & Mid(var,6,1) = "::" Then var = Mid(var,1,8) & vbTab & Mid(var,9,Len(var))
  10.       vbStr = vbStr & var & vbTab
  11.     End If
  12.   Next
  13.   vbStr = Left(vbStr, Len(vbStr)-1) & "分钟" & vbCrLf
  14. Next
  15. FSO.OpenTextFile("new.txt", 2, True).Write Left(vbStr, Len(vbStr)-4)
  16. Set FSO = Nothing
  17. CreateObject("Wscript.Shell").Run "cmd /cstart new.txt", True, False
  18. Function GetText(String)
  19.   Dim objExp
  20.   Set objExp = New RegExp
  21.   objExp.Global = True
  22.   objExp.IgnoreCase = True
  23.   objExp.Pattern = "<td>([^<>]+)<\/td>|\s|\S"
  24.   objExp.Execute(String)
  25.   GetText = objExp.Replace(String, "$1")
  26. End Function
复制代码

作者: batman    时间: 2012-12-28 22:56

再跟个简单的提取HTM(HTML)文件中文本的方法:
  1. '提取当前目录下TEST.HTML文件中的文本内容
  2. Dim HTML, Path
  3. Path = CreateObject("Wscript.Shell").CurrentDirectory
  4. Set HTML = GetObject(Path & "\test.html", "HtmlFile")
  5. Do Until HTML.ReadyState = "complete" : WScript.Sleep 200 : Loop
  6. WScript.Echo HTML.DocumentElement.InnerText
复制代码

作者: batman    时间: 2012-12-29 00:26

本帖最后由 batman 于 2012-12-29 00:38 编辑

2楼的代码还有点问题,补上一个:
  1. Dim HTML, Path, ReadStr
  2. Path = CreateObject("Wscript.Shell").CurrentDirectory & "\test.html"
  3. Set HTML = GetObject(Path, "HtmlFile")
  4. Do Until HTML.ReadyState = "complete" : WScript.Sleep 200 : Loop
  5. i = 0
  6. Do Until Err.Number <> 0
  7.   On Error Resume Next
  8.   str = ""
  9.   str = Trim(HTML.GetElementsByTagName("td")(i).InnerText)
  10.   If (i + 1) Mod 8 = 0 Then
  11.     str = str & vbCrLf
  12.     Else
  13.     str = str & vbTab
  14.   End If
  15.   If str <> "" Then ReadStr = ReadStr & str : i = i + 1
  16. Loop
  17. CreateObject("Scripting.FileSystemObject").OpenTextFile("new.txt", 2, True).Write ReadStr
  18. CreateObject("Wscript.Shell").Run "cmd /cstart new.txt", False, False
复制代码

作者: terse    时间: 2012-12-29 00:44

用sed处理了一下 不过还要二次处理 不搞了
  1. @echo off
  2. sed "s/^ *//;s/<td>/&\n/g;s/<\/td>/\n/g" "test.txt"|sed "/\(<span class=\|padding:\|^$\)/d"|sed -n "/<td>/{n;p}"
  3. pause
复制代码

作者: hijackle    时间: 2012-12-29 04:40

感谢版主和terse
作者: apang    时间: 2012-12-29 09:39

  1. @echo off&setlocal enabledelayedexpansion
  2. (for /f "tokens=*" %%a in (test.html) do (
  3.   if /i "%%a"=="<td>" set flag=1
  4.   if defined flag (
  5.     set "str2=%%a"
  6.     if /i "!str2!"=="</span>" set "str=!str!!str1!"
  7.     if "!str2:</td><td>=!" neq "!str2!" (
  8.       set "str=!str!!str1!"
  9.       set "str=!str!!str2:</td><td>= !"
  10.     )
  11.   )
  12.   if /i "%%a"=="</td>" echo,!str!&set "str="&set "flag="
  13.   set "str1=%%a"
  14. ))>New.txt
  15. start "" New.txt
复制代码

作者: BAT-VBS    时间: 2012-12-29 10:25

回复 6# hijackle


    问题解决后,请编辑顶楼帖子在标题前面注明[已解决],并给回答者加分。
作者: terse    时间: 2012-12-29 15:04

练下手  换行问题解决 (不知标签 是否一致)
  1. @echo off
  2. sed -n "s/<\/td><td>/ /g;/\(<span class=\|padding:\)/d;/<td>/,/<\/span>/p" test.htm|sed "s/^ *//;s/* $//;/<td>\|^$/d"|sed ":a;$!N;/[^<\/span>]/s/\n/ /;ta;s/<\/span>/\n/;P;D"
  3. PAUSE
复制代码





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