获取的数据透视表是干嘛的是乱码,是怎么回事

因为业务需求需要获取获取天气信息,在获取天气信息遇到n多问题(感觉没爱了),以下是问题及解决
之前获取天气预报的url :http://m.weather.com.cn/data/.html& 直接gg了,所以只能找其他的url代替了,找了半天找到了它
http://wthrcdn.etouch.cn/weather_mini?citykey=xxxxx &后面的xxxx指的是城市id,那么这个城市id怎么获取呢,
继续找找找了这个url:http://cj.weather.com.cn/support/Detail.aspx?id=51837fba1b35fe0f8411b6df这里面我们可以找打很多的id号,但是这么多的id不至于我们一个一个手动输入我们的数据库吧,答案当然不是,这个时候我们就可以使用我们强大的htmlunit网页抓取工具把我们想要的信息抓取出来,然后进行字符串分割保存到数据库中,具体如何抓取代码如下:
public static List&City& getCityInfo(){
//设置htmlunit不打印日志
LogFactory.getFactory().setAttribute("org.apache.commons.logging.Log", "org.apache.commons.logging.impl.NoOpLog");
WebClient webClient = new WebClient(BrowserVersion.CHROME);
webClient.getOptions().setThrowExceptionOnScriptError(false);
webClient.getOptions().setThrowExceptionOnFailingStatusCode(false);
webClient.getOptions().setJavaScriptEnabled(true);
webClient.getOptions().setActiveXNative(false);
webClient.getOptions().setCssEnabled(false);
webClient.getOptions().setThrowExceptionOnScriptError(false);
webClient.setAjaxController(new NicelyResynchronizingAjaxController());
webClient.getOptions().setJavaScriptEnabled(true);
List&City& result = new ArrayList&City&();
//获取城市id的url
String url = "http://cj.weather.com.cn/support/Detail.aspx?id=51837fba1b35fe0f8411b6df";
//通过webclient模拟一个网页,当然模拟的是这个url的
HtmlPage page = webClient.getPage(url);
//可以通过浏览器看到信息是放在p节点里的,所以我们获取所有的p节点
DomNodeList&DomElement& list = page.getElementsByTagName("p");
//遍历元素
for(DomElement domElement : list){
//这句话是为了过滤多余的标题和结尾信息
String attr = domElement.getAttribute("style");
//这句话是为了过滤第一行数据(city 城市 二级 一级)
//如果child是0说明没有子节点 如果不为0说明有子节点那就是第一行的p节点这个不是我们需要的
//可以通过浏览器查看p元素的结构
int child = domElement.getChildElementCount();
if(attr.equals("text-align:") && (child == 0)){
String res = domElement.getTextContent();
//这里其实有个坑 在获取的第一行数据中后面2个逗号为中文的,其他的逗号都是英文的
//所以这里统一下全部改成中文
String a = res.replaceAll(",", ",");
String []cityinfo = a.split(",");
City city = new City();
city.setId(cityinfo[0]);
city.setName(cityinfo[1]);
city.setSecgrade(cityinfo[2]);
city.setOndgrade(cityinfo[3]);
result.add(city);
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
这个方法可以写到一个工具类里面直接获取list就行了,不过有一个city &model需要你去建,拿到list后就可以保存到数据库中,需要一点时间毕竟有2275条数据^_^
2.拿到城市id 和获取天气的url(http://wthrcdn.etouch.cn/weather_mini?citykey=xxxxx&)后获取的数据总是乱码
这个问题是使用最纠结的,本来工具类是写好get方法获取数据的但是每次都是获取乱码,不论是给输入流加了"utf-8"编码还是使用URLDecode进行解码全部无济于事,人家仍是安安全全的给你返回乱码代码如下:
public static String sendGet(String url,String param){
URL realUrl = null;
//PrintWriter out =
String response = "";
BufferedReader br = null;
//真实地址
realUrl = new URL(url);
//打开连接
HttpURLConnection connection = (HttpURLConnection) realUrl.openConnection();
//设置连接属性
connection.setRequestProperty("accept", "application/xhtml+xml,application/json,application/charset=UTF-8, text/javascript, */*");
connection.setRequestProperty("connection", "Keep-Alive");
connection.setRequestProperty("user-agent",
"Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko");
connection.setDoOutput(true);
connection.setDoInput(true);
out = new PrintWriter(connection.getOutputStream());
out.write(param);
//out.flush();
br = new BufferedReader(new InputStreamReader(connection.getInputStream(),"utf-8"));
String line = "";
while((line=br.readLine())!=null){
response +=
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
//out.close();
br.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
网上也是有很多人推荐的是这种方法,but不行,纠结痛苦半天后我想到wireshark抓包工具,于是打开之,开始抓包
获取到抓包数据了 在我们的需要的数据上右击追踪流
然后我们就可以看见返回的数据信心,然后我们就会发现一个大坑,那就是返回的内容类型content-type:gzip,浏览器可以自动解析这个格式but我们java客户端不会呀,这也是为什么当你把url直接输入到浏览器可以看到完美的返回数据,但是从java http客户端获取就是乱码的原因
于是就想办法解决如何读取gzip压缩格式的文件,哈哈哈,还好sun公司已经封装了这个读取流^_^直接上代码:
* 获取天气预报信息
* @throws UnsupportedEncodingException
public static String getWeather(String url) throws UnsupportedEncodingException{
URL realUrl = null;
ByteArrayOutputStream out = null;
//真实地址
realUrl = new URL(url);
//打开连接
HttpURLConnection connection = (HttpURLConnection) realUrl.openConnection();
//设置连接属性
connection.setRequestProperty("accept", "application/xhtml+xml,application/json,application/charset=utf-8, text/javascript, */*");
connection.setRequestProperty("connection", "Keep-Alive");
connection.setRequestProperty("contentType", "utf-8");
connection.setRequestMethod("GET");
connection.setRequestProperty("user-agent",
"Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko");
//FileOutputStream out = new FileOutputStream("e:/text.txt");
//这里获取的数据时压缩格式的数据所以用gzip进行解压缩
GZIPInputStream gip = new GZIPInputStream(connection.getInputStream());
out = new ByteArrayOutputStream();
byte []buffer = new byte[1024];
while((len = gip.read(buffer))!=-1){
out.write(buffer, 0, len);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
if(out != null){
out.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
//把字节数据转化为字符串返回回去
return (new String(out.toByteArray(), "utf-8"));
同样这个方法写到一个工具类中就可以直接使用^_^
整个问题的解决感觉最坑的一步就是url返回的是gzip格式的压缩文件而不是我们希望的json数据 大坑~,
到此结束^_^
阅读(...) 评论()博客分类:
用servlet获取html 的表单数据时却发现,只能获取英文,中文出现乱码,解决方案是在servlet 的 service 方法中添加
request.setCharacterEncoding("utf-8");
ps:中文问题 需要注意
1.页面上的编码声明,最好UTF-8
2.servlet获得编码,与前台页面保持一致
3.服务器编码,与前台页面保持一致
所以最好都是UTF-8的
其他可参考的链接:
浏览: 305934 次
来自: 天津
你好,我想请教一下,要想输出一个NWB格式的文件,输入的格式要 ...
荣仔521 写道SWTResourceManager无法找到这 ...
SWTResourceManager无法找到这个类
(window.slotbydup=window.slotbydup || []).push({
id: '4773203',
container: s,
size: '200,200',
display: 'inlay-fix'记事本打开是乱码怎么办 记事本乱码修复方法
小编经常使用记事本保存一些文本文件,最近发现经常使用的txt文件打开是乱码,如下图:我初步分析应该是有些字符不支持造成的编码问题,经测试果然如此,下面看看具体的解决方法。问题分析造成记事本打不开的原因有很多。其中包括你电脑的字体库不充分,通过记事本打开及保存的编码不正确,软件故障以及兼容性的问题。也有可能不是而被软件或者人为改动了等情况。所以要根据具体情况来分析记事本打开出现乱码的故障。&解决方法  一、最简单的方法就是将你的txt文档的后缀名改掉,要看你改成原作者所编辑的格式,比如你原先是word文档格式,保存的时候保存的是txt格式,这样只能尝试改回doc格式,然后在用word打开即可,查看能不能显示正常。这种情况的解决方法就是用什么软件编写的txt文件就用什么软件打开。如果你将一个网页格式html格式保存txt文件的话,将其txt后缀名修改为html,然后直接打开就是一个网页,因为你用txt打开的话都是一些代码所以以为就是代码出错的症状。  二、用户所打开的记事本文档上面的字体系统不能识别,说明你的电脑字体库不够充分,可以尝试在网上上下载windows宋体、楷体等字体,再来重新打开txt文档查看是否正常。  三、编码问题导致记事本打开乱码也是很常见的,原作者所编写保存的txt文档是Unicode、UTF-8、Unicode big
endian类型,而我们默认打开的是ANSI类型。你可以将txt文件“另存为”,在另存为选择编码的时候换成Unicode或者其他编码试试能不能解决记事本乱码的现象。  四、还有就是不是.txt你右键选择打开方式选择了记事本,打不开也很正常。比如说你将一个word文档通过记事本的方式打开的话,就有乱码情况,这种情况你只能通过word文档的方式打开,而不能直接通过txt文件的方式进行打开。并不是什么文件都能用记事本打开的,可能能打开但是就会有乱码的现象,而我们只能在记事本上编写好的内容才能正常打开并且正常显示编辑记事本的内容。  五、终端输入gconf-editor调出gconf-edi(输入gconf-editor即可,前面不需要加Sudo),依次点开apps---gedit-2---preferences---encodings
中的auto-detected,在双击弹出对话框中依次加入GB18030,GBK,GB2312,然后将GB18030,GB2312移到最上。最后打开.txt文件,问题就解决了。你可以去尝试下。如果记事本出现乱码,我们如何才能找回记事本上面的内容信息?  1、你可以通过浏览器来打开记事本文档,如果能正常显示的话,那么你可以直接将内容复制出来。然后新建一个记事本,将内容粘贴上去,应该就能在记事本上正常显示。如果浏览器也是不能正常显示记事本的内容,可以在ie浏览器上点击工具栏的“查看--编码”,在选择其他编码试试,比如简体字文GB2312和繁体(big5)等编码。  2、最后通过一些软件去打开记事本,比如用UltraEdit文本编辑器,里面有个可以选择,选择16进制显示文字,就可以将内容正常显示。软件名称:UltraEdit破解版V20.00.1046 绿色汉化版
软件大小:
19.0M 下载地址:
阅读本文后您有什么感想? 已有
人给出评价!
04-10-1504-10-1504-10-1504-10-1504-10-1504-10-1504-10-1504-10-15
注:您的评论需要经过审核才会显示出来
Copyright &
PC6下载(www.pc6.com).All Rights Reserved
备案编号:湘ICP备号需要在后台进行encode操作,在前端页面进行decode操作。
URLEncoder.encode(str,"utf-8");前端代码(获取到数据后):
decodeURI(str);
页面与后台传递中文乱码问题(java乱码)
后台往前台传值,出现中文乱码问题。
解决页面传到后台含中文参数时会乱码问题
解决后台传到前台的值是中文乱码的问题
前台向后台传值出现的乱码的问题
没有更多推荐了,ajax获取数据中文乱码问题最简单的完美解决方案
转载 &更新时间:日 15:31:58 & 投稿:hebedich
这篇文章主要介绍了ajax获取数据中文乱码问题最简单的完美解决方案,需要的朋友可以参考下
使用scriptCharset即可解决问题,用contentType就不一定可以了。
&&&&& url: testUrl,
&&&&& dataType: 'jsonp',
&&&&& type: 'post',
&&&&& scriptCharset: 'utf-8'
上面的解决方案是最完美的,另外也附上网上的解决方式吧,是用contentType来处理的
jQuery(form).ajaxSubmit({
url: "ajax.aspx?a=memberlogin",
type: "post",
dataType: "json",
contentType: "application/x-www-form- charset=utf-8",
success: showLoginResponse
虽然也可以用,但是不推荐给大家哈。
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具

我要回帖

更多关于 excel数据透视表怎么做 的文章

 

随机推荐