标签:
写博客的目的就是让其他人少走弯路。
一开始看了今天博客园上的推荐文章,用C#+HtmlAgilityPack+XPath带你采集数据(以采集天气数据为例子),然后想自己也来采集一下天气,采集目标是腾讯天气。
腾讯天气的数据是用的js提供的(这里就不多做分析了下次有机会再写文章分析),然而用上文中的GetWebClient方法,传递一个js文件的地址,读取到的是一堆乱码。
问题出现了,自然要分析原因,为什么抓包工具能看到字符串的内容,浏览器也能展示字符串的内容,偏偏用程序不可以呢?
尝试了很多方法,换了很多字符编码依然不行。直到我看到了抓包工具中的这么一段内容,原来传递过来的流是一个bytes。
看来原因已经找到了,不是编码的问题,而是流本身的内容是二进制内容,直接转string肯定是乱码不对了,所以我们要把stream转成bytes才行。
然后就开始网上搜索对应的内容,然后再踩一个坑。
在使用 int l = stream.Length; 的时候碰到了“此流不支持查找操作”的错误。
这个错误的产生原因本质是网络流没法提前获取到长度,所以这个类不支持查找操作通常是网络流导致的。
然后再继续搜索这个错误的解决方法,然后找到了同样碰到这个问题的前辈,详见:http://bbs.csdn.net/topics/340175313
这里就感谢这位前辈了,很多人在网上提问,没人回答,后来自己解决了问题就算了,没想到回到自己的帖子里去自问自答一下,其实这样自问自答一下可以帮助更多的后面的人!!!
最后我用了如下的方法解决了这个问题
public static byte[] ReturnStrem(string url) { string Url = url; byte[] data1 = null; MSXML2.XMLHTTP _xmlhttp = new MSXML2.XMLHTTPClass(); _xmlhttp.open("GET", Url, false, null, null); _xmlhttp.send(null); if (_xmlhttp.readyState == 4) { data1 = (byte[])_xmlhttp.responseBody; } _xmlhttp.abort(); return data1;
对于新手来说,这里复制了代码又出现了新的问题,我这里一并解释清楚吧。
首先MSXML2是要引用什么?
答:项目右键--引用--COM--Microsoft XML 3.0
引用后直接执行报错“无法嵌入互操作类型”,怎么办?
答:项目--引用--找到MSXML2右键属性,嵌入互操作类型设置为false
最后问题圆满解决,解决这个问题花了一下午时间,希望我踩的坑能给其他人节省更多的时间。
标签:
原文地址:http://www.cnblogs.com/JangoJing/p/4773712.html