Board logo

标题: [技术讨论] 对vbs另存网页源码为txt出错的讨论 [打印本页]

作者: batman    时间: 2011-3-12 23:04     标题: 对vbs另存网页源码为txt出错的讨论

下面是段获取批处理之家主页源码并另存为txt的vbs代码,但不知道为什么成功获取的源码总是不能写入txt(但可以写入剪贴板)?请大家帮忙看下到底问题出在哪里?难道是文本格式的问题?
  1. Dim url, ie
  2. url = "http:\\www.bathome.net"
  3. set ie = CreateObject("InternetExplorer.Application")
  4. ie.navigate url
  5. while ie.busy :wscript.sleep 1000:wend
  6. vbstr = ie.document.body.innerHTML
  7. ie.Document.parentwindow.clipboarddata.setdata "text" , vbstr  '这是写入剪贴板
  8. ie.Quit
  9. Set ie = Nothing
  10. Set fso = CreateObject("scripting.filesystemobject")
  11. Set text = fso.opentextfile("temp.txt" , 1 , true)  
  12. text.Write vbstr  '写入txt出错
  13. text.Close
  14. Set text = nothing
  15. Set fso = Nothing
复制代码

[ 本帖最后由 batman 于 2011-3-13 01:24 编辑 ]
作者: asnahu    时间: 2011-3-12 23:18

先创建后打开,可直接写入创建的文件。
作者: batman    时间: 2011-3-12 23:31     标题: 回复 2楼 的帖子

试过了不行的。。。但用另外一个方法解决了,不过前面问题还是没有搞清楚。。。
  1. Set http = createObject("Microsoft.XMLHTTP")
  2. http.Open "get" , "http://www.bathome.net" , 0
  3. http.send()
  4. Set myGet = createObject("ADODB.Stream")
  5. myGet.Mode = 3
  6. myGet.Type = 1
  7. myGet.Open()
  8. myGet.Write(http.responseBody)
  9. myGet.SaveToFile "temp.txt" , 2
  10. myGet.Close
  11. Set myGet = Nothing
  12. Set http = Nothing
复制代码

作者: Spring    时间: 2011-3-13 00:54

模式设置错了,1是读取模式,不能写入,可以用2(写入)或者8(追加)。
而且一般网页保存最好用UNICODE模式:
  1. Set text = fso.opentextfile("temp.txt" , 2 , true, -1)
复制代码

作者: batman    时间: 2011-3-13 01:07     标题: 回复 4楼 的帖子

我承认是我搞错了模式(是在复制代码后改错的),我实际上是用("temp.txt" , 2 , ture)写了无数次不成功的(将vbstr变成普通字符是可以正常写入的)。所以,我估计是编码带来的问题吧。。。。
作者: asnahu    时间: 2011-3-13 01:14

改成
  1. URL = "http:\\www.bathome.net"
  2. Set strIE = CreateObject("InternetExplorer.Application")
  3. strIE.Visible = False
  4. strIE.Navigate(URL)
  5. Do While strIE.ReadyState <> 4
  6. Loop
  7. str = strIE.document.body.innerHTML
  8. strIE.quit
  9. Set FSO = CreateObject("scripting.filesystemobject")
  10. set strfile = FSO.CreateTextFile("temp.txt",true,true)
  11. strfile.write str
  12. Set FSO = Nothing
复制代码

作者: asnahu    时间: 2011-3-13 01:16

网页有些unicode字符,所以需要创建unicode而不是ansi文本。
作者: batman    时间: 2011-3-13 01:21

楼上的厉害,学习了。。。。

同时,可以解释下原理不?
作者: batman    时间: 2011-3-13 01:23     标题: 回复 7楼 的帖子

哦,原来是这样,看来我估计得不错,呵呵,再次感谢。。。
作者: batman    时间: 2011-3-13 02:01

本人三楼的代码和六楼的代码同样实现了将bathome主页的源码存入txt,但三楼代码存入的格式为ansi格式,而六楼存入的格式为unicode格式,从最后保存结果来看,六楼代码存入的源码更完整更准确(当然我们可以把保存的ansi文本另存为unicode格式,但就会出现不可见字符“黑框”),运行下面的代码大家就明白了:
  1. Dim url, num
  2. url = "http://www.bathome.net"
  3. Set http = createObject("Microsoft.XMLHTTP")
  4. http.Open "get" , url , 0
  5. http.send()
  6. num = lenb(http.responseBody)
  7. Set http = Nothing
  8. Set IE = CreateObject("InternetExplorer.Application")
  9. IE.Visible = False
  10. IE.Navigate URL
  11. Do While IE.ReadyState <> 4
  12. Loop
  13. msgbox "ansi编码格式下获取源码总字节数:" & num & vbCrLf& "unicode编码格式下获取源码总字节数:" & Lenb(IE.document.body.innerHTML) & vbcrlf & "ansi比unicode格式少" & Lenb(IE.document.body.innerHTML)-num & "个字符!"
  14. IE.quit
  15. Set ie = Nothing
复制代码

作者: powerbat    时间: 2011-4-1 22:48

涉及到网页和http最好的对象当然是XMLHTTP和ADODB.Stream这对兄弟了
XMLHTTP有个方法好像可以获取网页的编码格式,回家查一下MSDN

fso不爽的是不支持UTF-8,还是ADODB.Stream更强大,还能处理二进制文件。
作者: lqxcsj    时间: 2011-10-25 16:50

怎样保存多个网页?
作者: famersoft    时间: 2012-10-25 17:17

今天 也遇到 了同样的问题,找了半天没找出原因,在batman的帮助下才明白过来,学习过!




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