前言

最近做一个搜索项目,需要爬取很多网站获取需要的信息。在爬取网页的时候,需要获得该网页的编码,不然的话会发现爬取下来的网页有很多都是乱码。

分析

一般情况下,网页头信息会指定编码,可以解析header或者meta获得charset。但有时网页并没没有指定编码,这时就需要通过网页内容检测编码格式,通过调研,最好用的还是cpdetector。

cpdetector自动检测文本编码格式,谁先返回非空,就以该结果为字符编码。内置了一些常用的探测实现类,这些探测实现类的实例可以通过add方法加进来,如

等,detector按照“谁先返回非空的探测结果,就以谁的结果为准”的原则返回探测到的字符集编码。

1、首先,可从header中解析charset

网页头信息中的Content-Type会指定编码,如图:

可以通过分析header,查找字符编码。

Map> map =urlConnection.getHeaderFields();

Set keys =map.keySet();

Iterator iterator =keys.iterator();//遍历,查找字符编码

String key = null;

String tmp= null;while(iterator.hasNext()) {

key=iterator.next();

tmp=map.get(key).toString().toLowerCase();//获取content-type charset

if (key != null && key.equals("Content-Type")) {int m = tmp.indexOf("charset=");if (m != -1) {

strencoding= tmp.substring(m + 8).replace("]", "");returnstrencoding;

}

}

}

2、其次,可从网页meta中解析出charset

正常情况下,在写网页时,会指定网页编码,可在meta中读出来。如图:

首先获取网页流,因为英文和数字不会乱码,可以解析meta,获得charset。

StringBuffer sb = newStringBuffer();

String line;try{

BufferedReader in= new BufferedReader(newInputStreamReader(url

.openStream()));while ((line = in.readLine()) != null) {

sb.append(line);

}

in.close();

}catch (Exception e) { //Report any errors that arise

System.err.println(e);

System.err

.println("Usage: java HttpClient []");

}

String htmlcode=sb.toString();//解析html源码,取出区域,并取出charset

String strbegin = "

String strend= ">";

String strtmp;int begin =htmlcode.indexOf(strbegin);int end = -1;intinttmp;while (begin > -1) {

end=htmlcode.substring(begin).indexOf(strend);if (begin > -1 && end > -1) {

strtmp= htmlcode.substring(begin, begin +end).toLowerCase();

inttmp= strtmp.indexOf("charset");if (inttmp > -1) {

strencoding= strtmp.substring(inttmp + 7, end).replace("=", "").replace("/", "").replace("\"", "")

.replace("\'", "").replace(" ", "");returnstrencoding;

}

}

htmlcode=htmlcode.substring(begin);

begin=htmlcode.indexOf(strbegin);

}

3、当使用1、2解析不出编码时,使用cpdetector根据网页内容探测出编码格式

可以添加多个编码探测实例:

public static void getFileEncoding(URL url) throwsMalformedURLException, IOException {

CodepageDetectorProxy codepageDetectorProxy=CodepageDetectorProxy.getInstance();

codepageDetectorProxy.add(JChardetFacade.getInstance());

codepageDetectorProxy.add(ASCIIDetector.getInstance());

codepageDetectorProxy.add(UnicodeDetector.getInstance());

codepageDetectorProxy.add(new ParsingDetector(false));

codepageDetectorProxy.add(newByteOrderMarkDetector());

Charset charset=codepageDetectorProxy.detectCodepage(url);

System.out.println(charset.name());

}

}

java 获取网页编码_spider JAVA如何判断网页编码相关推荐

  1. java获取字符串占用的字节大小,以及不同编码下一个汉字占用的字节数

    其实就是String.getBytes().length这样就可以获得字节长度了. 我们知道一个数字是一个字节,一个汉字是2个字节,但是这个不是绝对的,在不同的编码下,字节数是不一样的 英文字母和中文 ...

  2. java 获取已有字体,java获取本机全部可用字体

    java获取本机所有可用字体 //just for fun,那个28个字母的函数满满都是恶心 import java.awt.GraphicsEnvironment ; class Tester { ...

  3. java获取jtable的路径,Java如何在JTable组件中获取选定的单元格?

    以下示例显示如何获取选定的行或选定的列,或如何选择JTable组件中的多个单元格.要侦听选择事件,我们可以JTable通过调用JTable.getSelectionModel().addListSel ...

  4. java获取文件名方法,利用Java获取文件名、类名、方法名和行号的方法小结

    大家都知道,在C语言中,我们可以通过宏FILE. __LINE__来获取文件名和行号,而在Java语言中,则可以通过StackTraceElement类来获取文件名.类名.方法名.行号,具体代码如下: ...

  5. java获取access token_【Java示例】如何获取AccessToken

    好多新注册的开发者表示不太清楚如何获取AccessToken.首先还是建议大家看官网文档 http://ai.baidu.com/docs#/Begin/top 小帅帮大家写一个Java调用的示例 首 ...

  6. java获取access token_微信java 开发4 access_token获取

    首先你得有url吧 public final static String access_token_url = "https://api.weixin.qq.com/cgi-bin/toke ...

  7. java 获取远程服务器信息,java 远程获取服务器信息

    java 远程获取服务器信息 内容精选 换一换 已成功登录Java性能分析.待安装Guardian的服务器已开启sshd.待安装Guardian的服务器已安装JRE,JRE版本要求为Huawei JD ...

  8. java 获取服务器上文件,java获取远程服务器上的文件

    java获取远程服务器上的文件 内容精选 换一换 已成功登录Java性能分析.待安装Guardian的服务器已开启sshd.待安装Guardian的服务器已安装JRE,JRE版本要求为Huawei J ...

  9. java获取文件列表,[javaSE] java获取文件列表

    递归测试 import java.io.File; import java.util.ArrayList; import java.util.HashMap; import java.util.Lis ...

  10. java获取环境变量路径/java获取环境变量和系统属性

    Java获取服务器环境变量和JVM系统变量 当程序中需要使用与操作系统相关的变量(例如:文件分隔符.换行符)时,Java提供了System类的静态方法getenv()和getProperty()用于返 ...

最新文章

  1. 管理数百个Kubernetes集群需要什么?
  2. 全球及中国生物质能发电产业十四五利用现状及建设布局研究报告2021-2027年
  3. [转载]图的割点、桥与双连通分支
  4. SpringCloud主要组件
  5. Quartz 定时任务(Scheduler)的 3 种实现方式
  6. spring循环依赖及解决方式_来探究一下Spring 循环依赖的三种方式
  7. 定时器中断程序控制led闪烁
  8. c语言学习笔记【结构体02】结构体指针变量与结构体变量的函数参数,C语言学习笔记结构体02结构体指针变量与结构体变量的函数参数.docx...
  9. 基于libpcan库can总线操作的Barrett 机械手控制及腕部六维力传感器驱动
  10. POJ2559最大矩形面积——单调栈
  11. 推荐两个有意思的自定义View小项目
  12. 上海万科地产档案室—智慧管理项目
  13. tooltips被遮盖
  14. 【过程挖掘算法3】Heuristic Miner(启发式挖掘算法)
  15. 中国筋膜枪行业销售状况及营销前景预测报告(2022-2027年版)
  16. 《深入理解计算机系统》——低谷中的重新振作
  17. 有人说程序员是一个很高大上又高不可攀的职业,你认同吗?
  18. Scratch课程设计(五)
  19. 【算法知识】先验分布、后验分布、似然估计
  20. 《高效程序员的修炼》读后感

热门文章

  1. helmet是一个保护Node.JS应用的安全项目
  2. 基于stm32f103zet6(精英版)vct6 vet6的通用定时器(TIM2~TIM5)的pwm输出
  3. [Node] Node.js 包管理工具详解npm yarn cnpm npx pnpm
  4. EXCEL函数运用【关键词搜索另一个表的内容】【二个单元格是否一致】
  5. 汽车品牌、资讯、出行App获取安装来源统计
  6. 使用android杀蚊子
  7. IDM 6.25build 21超精版/超晶版
  8. 荔枝财报背后:腾讯、字节跳动、快手们都盯上了在线音频
  9. uni-app开启消息通知
  10. 吐秀山下,菜子湖畔,一年四季,家乡盛景