当前位置:编程学习 > JAVA >>

(急急)java 网页抓取时,有的空格变成???? 但是汉字不乱码 知道的话在加50分

做抓取新闻页面时,内容里 空格竟然变成问号, 主要是新华网,别的网站没有,但是新华网有的网页也不会变成问号 

如<p>????帕特里奥塔表示,巴西新政府高度重视发展对华关系,认为中国是重要的战略伙伴。巴方愿同中方共同努力,进一步推进双方各领域合作,加强双方在重大国际和地区问题上的沟通,推动两国战略伙伴关系深入发展。</p>
<p>????外交部长杨洁篪、商务部长陈德铭和巴西发展工业外贸部长皮门特尔参加会见。</p>

不知道原因

有知道的吗?
知道的话 在加50分(http://topic.csdn.net/u/20110302/18/448a3f47-ff93-454a-981f-bd4426858c92.html这个链接 回复一下就行)

代码是:

import java.io.BufferedReader;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;

public class Test {

public static void main(String aargs[]){
URL url;
try {
url = new URL("http://news.xinhuanet.com/2011-03/03/c_121146024.htm");
URLConnection conn = url.openConnection();
conn.setDoOutput(true);
InputStream in = null;
    in = url.openStream();
    String content = pipe(in,"utf-8");
    System.out.println(content);
} catch (MalformedURLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch(IOException e){
e.printStackTrace();
}

}
static String pipe(InputStream in,String charset) throws IOException {   
StringBuffer s = new StringBuffer();     
if(charset==null||"".equals(charset)){    
charset="utf-8";  
}      
String rLine = null;   
BufferedReader bReader = new BufferedReader(new InputStreamReader(in,charset));  
PrintWriter pw = null;        
FileOutputStream fo = new FileOutputStream("../index.html");
      OutputStreamWriter writer = new OutputStreamWriter(fo, "utf-8");
      pw = new PrintWriter(writer);     
      while ( (rLine = bReader.readLine()) != null) {   
      String tmp_rLine = rLine;       
      int str_len = tmp_rLine.length();     
      if (str_len > 0) {           
      s.append(tmp_rLine+"\n");      
      pw.println(tmp_rLine);    
      pw.flush();           
          }          
      tmp_rLine = null; 
       }   
       in.close();  
       pw.close();   
       return s.toString();
       
}

}
大家试一试 到底什么原因   --------------------编程问答-------------------- utf-8换成gb2312 --------------------编程问答--------------------
引用 1 楼 xiaoshi0375 的回复:
utf-8换成gb2312
换成 这个 汉字就乱码 

新华网采用的 是 utf-8的  在说了  是汉字乱码编码才错 我汉字显示正常  只是读取HTML  空格的时候才是问号   只是内容里才是问号 其他的空格一律正常     --------------------编程问答-------------------- --------------------编程问答-------------------- 我也遇到过,没有解决!

    我最后只好把全部的问号替换了!

   哎! --------------------编程问答--------------------
引用 4 楼 adsdassadfasdfasdf 的回复:
我也遇到过,没有解决!

  我最后只好把全部的问号替换了!

  哎!

怎么替换的啊  我用replace("????", "")替换不了啊  
要是能替换 我也不会这么着急了 --------------------编程问答-------------------- 不能替换?  不是吧  那还不要疯了 --------------------编程问答-------------------- 肯定是开发时候的编码问题;
你悲剧了,那个网页上编码有问题,比如说你有时候在网页上拷贝的代码不能在eclipse里保存,会提示编码格式不正确,这时候你删除几个空格就可以保存了,有时候会选择在windows底下强制保存,这个乱码很可能就是他们开发时候这样来的。
现在唯一的解决办法就是replaceAll了,替换所有的四个问号,要快的好只有这样了 --------------------编程问答-------------------- 回复6L:
键关键是没法替换了  不知道那问号 是什么格式的   你可以试一试 上面那段代码 

帮帮忙吧   --------------------编程问答--------------------
引用 7 楼 l_h_y123 的回复:
肯定是开发时候的编码问题;
你悲剧了,那个网页上编码有问题,比如说你有时候在网页上拷贝的代码不能在eclipse里保存,会提示编码格式不正确,这时候你删除几个空格就可以保存了,有时候会选择在windows底下强制保存,这个乱码很可能就是他们开发时候这样来的。
现在唯一的解决办法就是replaceAll了,替换所有的四个问号,要快的好只有这样了


可是没法替换啊  我弄了好久  都替换不了  你帮帮忙 看看那段代码 上面有复制下 试一试 谢谢了 --------------------编程问答-------------------- replaceAll("[????]","")或者replaceAll("\\?\\?\\?\\?","")都试试  我一会看下 --------------------编程问答-------------------- System.out.println(content.replaceAll("//?//?//?//?",""));这个搞定 --------------------编程问答--------------------
引用 11 楼 l_h_y123 的回复:
System.out.println(content.replaceAll("//?//?//?//?",""));这个搞定

不行啊  

打印出来的还是

<p>????温家宝说,近年来中国同巴西的友好合作关系全面、快速发展,在双边和国际领域都取得重要成果,其意义和影响是广泛而深远的。</p>

不知道怎么回事 我不理解啊  

要是这样直接就去掉了 我也不会这么麻烦了

你不要复制那段话  直接运行上面的代码  打印出来一句话看看是不是还在。 谢谢 --------------------编程问答-------------------- 我也发现了,我在试下我的终极办法 --------------------编程问答--------------------
引用 13 楼 l_h_y123 的回复:
我也发现了,我在试下我的终极办法


可能是问号的编码问题  不知道是什么格式的 复制上去也不行 试了别的也不行 是不是我的IDE有问题i啊 

不会吧 --------------------编程问答-------------------- 不行,期待高手出现。。。 --------------------编程问答--------------------  把String tmp_rLine = rLine;换成 String tmp_rLine = rLine.replaceAll(" ");这个空格是全角的空格,你试下看可以不 --------------------编程问答-------------------- 楼上办法我试过了,全角空格不行 --------------------编程问答--------------------
引用 16 楼 z3167181213 的回复:
把String tmp_rLine = rLine;换成 String tmp_rLine = rLine.replaceAll(" ");这个空格是全角的空格,你试下看可以不

这不问号的问题,因为虽然显示的是问号 但是是乱码  她可能是汉字 字母 或者其他字符 

所以就不会过滤掉了

所以没有办法 期待高手解决  这个是新华网的问题 不知道 他网页的编码机制 是什么 ?





高手~~~~~~~~~~~~~~~~~~~~~~~~~~~~~······ --------------------编程问答-------------------- 如果还没有办法 只能让网页显示 汉字字母 还有其他的符号 ,这样做 岂不更麻烦了,谁知道以后网上会显示什么字符 ,这样做只能屏蔽了很多不改屏蔽的东西,而且最最麻烦和没有可用性了! --------------------编程问答-------------------- 高手吃饭去了吗 
 看到的帮忙解决一下 小弟不胜感激  不知道的顶一下 不胜感激 ,学习一下 

谢谢了! --------------------编程问答-------------------- 乱码显示出来应该不是我们正常输入的?,所以是替换不了的
估计是页面编码导致的,不好搞 --------------------编程问答-------------------- 估计空格是全角状态下的 --------------------编程问答--------------------
String regEx = "[\\x00-\\xff][\\x00-\\x7F]";
Pattern p = Pattern.compile(regEx);
String stra = " 高ah?蒚";
Matcher matcher = p.matcher(stra);
System.out.println(matcher.replaceAll(""));

不知道这样能不能满足你的要求 --------------------编程问答--------------------   --------------------编程问答-------------------- 很幸运楼主,前两天我也碰到了类似的问题,有个网站的网页编码是utf-8的,我抓取下也是一大堆问号,而且替换不掉,楼主尝试下用这个试试,有用给分谢谢

String dsp= 抓取的网页内容;
dsp = new String(dsp.getBytes(),"GBK").replace('?', ' ').replace(' ', ' ')
; --------------------编程问答--------------------
引用 25 楼 luciferdevil 的回复:
很幸运楼主,前两天我也碰到了类似的问题,有个网站的网页编码是utf-8的,我抓取下也是一大堆问号,而且替换不掉,楼主尝试下用这个试试,有用给分谢谢
Java code

String dsp= 抓取的网页内容;
dsp = new String(dsp.getBytes(),"GBK").replace('?', ' ').replace(' ', ' ')

;

replace(' ', ' ') 前面这个是全角空格 请注意 --------------------编程问答-------------------- 顶楼上,你这个可以,我刚才也用了这种办法,只不过刚才我用的getbytes 是 gb2312 呵呵 --------------------编程问答-------------------- --------------------编程问答-------------------- new String(dsp.getBytes("iso8859-1"),"gb2312"),怪不得我的终极办法刚才不行,原来我的byte数组转成了iso8859-1,一大堆乱码 --------------------编程问答--------------------
引用 26 楼 luciferdevil 的回复:
引用 25 楼 luciferdevil 的回复:

很幸运楼主,前两天我也碰到了类似的问题,有个网站的网页编码是utf-8的,我抓取下也是一大堆问号,而且替换不掉,楼主尝试下用这个试试,有用给分谢谢
Java code

String dsp= 抓取的网页内容;
dsp = new String(dsp.getBytes(),"GBK").replace('?', ' ').repl……


麻烦大哥帮忙解释一下   看不懂代码什么意思啊 ? --------------------编程问答--------------------
引用 26 楼 luciferdevil 的回复:
引用 25 楼 luciferdevil 的回复:

很幸运楼主,前两天我也碰到了类似的问题,有个网站的网页编码是utf-8的,我抓取下也是一大堆问号,而且替换不掉,楼主尝试下用这个试试,有用给分谢谢
Java code

String dsp= 抓取的网页内容;
dsp = new String(dsp.getBytes(),"GBK").replace('?', ' ').repl……


麻烦哥们解释一下 什么意思 顺便再http://topic.csdn.net/u/20110302/18/448a3f47-ff93-454a-981f-bd4426858c92.html  这个网址回复一下  那儿也有50分  给你分  谢谢! --------------------编程问答-------------------- 你照抄用就好了,哈哈,字符串先转换成byte数组,第一个replace问号替换为半角空格,第二个全角空格替换半角空格,功劳是人家的,给我点苦劳就好了 --------------------编程问答-------------------- --------------------编程问答--------------------
引用 32 楼 l_h_y123 的回复:
你照抄用就好了,哈哈,字符串先转换成byte数组,第一个replace问号替换为半角空格,第二个全角空格替换半角空格,功劳是人家的,给我点苦劳就好了


懂了 懂了  --------------------编程问答-------------------- 把空格换成 试试。。 --------------------编程问答-------------------- 不是编码问题,我原先抓取网页时候遇到过
是因为空格是 转义过的,这个 抓下来出现了乱码"????",所以要单独对 处理,我原先写过一个方法,忘记了,可以给你查查 --------------------编程问答--------------------
引用 36 楼 ilrxx 的回复:
不是编码问题,我原先抓取网页时候遇到过
是因为空格是&nbsp;转义过的,这个&nbsp;抓下来出现了乱码"????",所以要单独对&nbsp;处理,我原先写过一个方法,忘记了,可以给你查查


谢谢 最好给我查一下  LS的兄弟方法虽然对 但是把所有的问号(不包括中文)都过滤了 最好能正常读出来最好了 ,呵呵  --------------------编程问答-------------------- 可以写代买去掉空格。。。。。

我做过, --------------------编程问答-------------------- 楼主怎么这么笨,呵呵,把一个问号换成四个问号不就完了;
content = new String(content.getBytes(),"gb2312").replace("????", " ").replace(' ', ' '); --------------------编程问答--------------------
引用 36 楼 ilrxx 的回复:
不是编码问题,我原先抓取网页时候遇到过
是因为空格是&nbsp;转义过的,这个&nbsp;抓下来出现了乱码"????",所以要单独对&nbsp;处理,我原先写过一个方法,忘记了,可以给你查查

关 什么事,这些符号是以明文表现在源码里的,怎么会被Java“翻译” 四个问号呢 --------------------编程问答-------------------- --------------------编程问答-------------------- --------------------编程问答-------------------- 这样:

String s = "????";
byte[] b = s.getBytes();
for(byte by : b){
by = (byte) ((by >> 1) + 1);
System.out.println((char)by);
}

意思就是????的ascii码是63,对应的二进制是111111,然后空格的ascii是32,对应的二进制是100000,先进性右移操作在+1得到byte,值为32,即空格的ascii码,然后直接转成char就得到了空格,右移运算也可以直接改为&运算,即为by = (byte) (by & 100000); --------------------编程问答--------------------
引用 40 楼 luciferdevil 的回复:
引用 36 楼 ilrxx 的回复:

不是编码问题,我原先抓取网页时候遇到过
是因为空格是&amp;nbsp;转义过的,这个&amp;nbsp;抓下来出现了乱码"????",所以要单独对&amp;nbsp;处理,我原先写过一个方法,忘记了,可以给你查查

关&nbsp什么事,这些符号是以明文表现在源码里的,怎么会被Java“翻译” 四个问号呢


我也不清楚,可能是编码问题?但是我原先抓取都设置过和页面一样的编码拿下来,中文没问题,就只有这个 会出现乱码,不知道什么情况。中文没问题就说明不是编码方式不同造成的乱码 --------------------编程问答--------------------
引用 39 楼 l_h_y123 的回复:
楼主怎么这么笨,呵呵,把一个问号换成四个问号不就完了;
content = new String(content.getBytes(),"gb2312").replace("????", " ").replace(' ', ' ');


这样不行啊,关键是你都不确定有几个问题啊,有五个或者只有一个  这种方法也是没办法的方法,要是能读书来空格就好了!  没办法啊  呵呵 实在不行  只能用这个了! --------------------编程问答-------------------- --------------------编程问答-------------------- 把你抓取过来的整个字符串发个看看呗, 一直没太明白你意思. --------------------编程问答-------------------- byte[] b = s.getBytes();
        for(byte by : b){
            by = (byte) ((by >> 1) + 1);
            System.out.println((char)by);
        }
用我这个方法,你只需要传一个string进来,会帮你把所有的?都换成空格,这样行吗?问题可是原本应该是?的地方也换成空格了。。 --------------------编程问答-------------------- 对了循环里面加个if,if(by == 63)要判断下是?才转
String s = "????aa";
byte[] b = s.getBytes();
for(byte by : b){
if(by == 63)
by = (byte) (by & 100000);
System.out.print((char)by); --------------------编程问答-------------------- 你的那个帖子有个哥们说的不错,我早上也测了 下 你的读取openstream()转换为inputstream这里改改或许就好了,问题根源在这里
引用 9 楼 fulong258 的回复:
刚才有点问题,这样!
Java code

URL ur = new URL("http://news.xinhuanet.com/theory/2011-03/01/c_121133526.htm");
HttpURLConnection http  = (HttpURLConnection) ur.openConnection();
InputStream reader = http.g……
--------------------编程问答--------------------

public static String changeStr(String s) {
StringBuffer sb = new StringBuffer(1024);
if(s == null)
return "";
byte[] b = s.getBytes();
for (byte by : b) {
if (by == 63)
by = (byte) (by & 100000);
sb.append((char)by);
}
return sb.toString();
}


给你写个方法,调用这个,往里面传你抓下来的内容就行了 --------------------编程问答-------------------- http://topic.csdn.net/u/20110302/18/448a3f47-ff93-454a-981f-bd4426858c92.html --------------------编程问答-------------------- --------------------编程问答--------------------
引用 52 楼 fulong258 的回复:
http://topic.csdn.net/u/20110302/18/448a3f47-ff93-454a-981f-bd4426858c92.html


还是不行  <p>????新华网北  乱码

谢了  --------------------编程问答-------------------- --------------------编程问答-------------------- 我遇到了和你一样的问题,经过测试,我的问题是因为HttpResponse输出的时候,getWriter的print方法使用了系统默认的编码方式,把格式又搞坏了。只要把response编码设置setCharacterEncoding()为目标页面的编码就可以了 --------------------编程问答-------------------- 我也遇到这个问题,解决方法为:
  首先吧那个字符拷贝用java的replace方法替换掉就可以了。那个字符不是全角空格很诡异,没弄清楚是什么字符。 --------------------编程问答-------------------- p_pre_pre_text = new String(p_pre_pre_text.getBytes(),"GBK").replaceAll(new String(" "), "").replaceAll("\\?", "");
补充:Java ,  Java EE
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,