java 获取网页编码_spider JAVA如何判断网页编码
前言
最近做一个搜索项目,需要爬取很多网站获取需要的信息。在爬取网页的时候,需要获得该网页的编码,不然的话会发现爬取下来的网页有很多都是乱码。
分析
一般情况下,网页头信息会指定编码,可以解析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如何判断网页编码相关推荐
- java获取字符串占用的字节大小,以及不同编码下一个汉字占用的字节数
其实就是String.getBytes().length这样就可以获得字节长度了. 我们知道一个数字是一个字节,一个汉字是2个字节,但是这个不是绝对的,在不同的编码下,字节数是不一样的 英文字母和中文 ...
- java 获取已有字体,java获取本机全部可用字体
java获取本机所有可用字体 //just for fun,那个28个字母的函数满满都是恶心 import java.awt.GraphicsEnvironment ; class Tester { ...
- java获取jtable的路径,Java如何在JTable组件中获取选定的单元格?
以下示例显示如何获取选定的行或选定的列,或如何选择JTable组件中的多个单元格.要侦听选择事件,我们可以JTable通过调用JTable.getSelectionModel().addListSel ...
- java获取文件名方法,利用Java获取文件名、类名、方法名和行号的方法小结
大家都知道,在C语言中,我们可以通过宏FILE. __LINE__来获取文件名和行号,而在Java语言中,则可以通过StackTraceElement类来获取文件名.类名.方法名.行号,具体代码如下: ...
- java获取access token_【Java示例】如何获取AccessToken
好多新注册的开发者表示不太清楚如何获取AccessToken.首先还是建议大家看官网文档 http://ai.baidu.com/docs#/Begin/top 小帅帮大家写一个Java调用的示例 首 ...
- java获取access token_微信java 开发4 access_token获取
首先你得有url吧 public final static String access_token_url = "https://api.weixin.qq.com/cgi-bin/toke ...
- java 获取远程服务器信息,java 远程获取服务器信息
java 远程获取服务器信息 内容精选 换一换 已成功登录Java性能分析.待安装Guardian的服务器已开启sshd.待安装Guardian的服务器已安装JRE,JRE版本要求为Huawei JD ...
- java 获取服务器上文件,java获取远程服务器上的文件
java获取远程服务器上的文件 内容精选 换一换 已成功登录Java性能分析.待安装Guardian的服务器已开启sshd.待安装Guardian的服务器已安装JRE,JRE版本要求为Huawei J ...
- java获取文件列表,[javaSE] java获取文件列表
递归测试 import java.io.File; import java.util.ArrayList; import java.util.HashMap; import java.util.Lis ...
- java获取环境变量路径/java获取环境变量和系统属性
Java获取服务器环境变量和JVM系统变量 当程序中需要使用与操作系统相关的变量(例如:文件分隔符.换行符)时,Java提供了System类的静态方法getenv()和getProperty()用于返 ...
最新文章
- 管理数百个Kubernetes集群需要什么?
- 全球及中国生物质能发电产业十四五利用现状及建设布局研究报告2021-2027年
- [转载]图的割点、桥与双连通分支
- SpringCloud主要组件
- Quartz 定时任务(Scheduler)的 3 种实现方式
- spring循环依赖及解决方式_来探究一下Spring 循环依赖的三种方式
- 定时器中断程序控制led闪烁
- c语言学习笔记【结构体02】结构体指针变量与结构体变量的函数参数,C语言学习笔记结构体02结构体指针变量与结构体变量的函数参数.docx...
- 基于libpcan库can总线操作的Barrett 机械手控制及腕部六维力传感器驱动
- POJ2559最大矩形面积——单调栈
- 推荐两个有意思的自定义View小项目
- 上海万科地产档案室—智慧管理项目
- tooltips被遮盖
- 【过程挖掘算法3】Heuristic Miner(启发式挖掘算法)
- 中国筋膜枪行业销售状况及营销前景预测报告(2022-2027年版)
- 《深入理解计算机系统》——低谷中的重新振作
- 有人说程序员是一个很高大上又高不可攀的职业,你认同吗?
- Scratch课程设计(五)
- 【算法知识】先验分布、后验分布、似然估计
- 《高效程序员的修炼》读后感
热门文章
- helmet是一个保护Node.JS应用的安全项目
- 基于stm32f103zet6(精英版)vct6 vet6的通用定时器(TIM2~TIM5)的pwm输出
- [Node] Node.js 包管理工具详解npm yarn cnpm npx pnpm
- EXCEL函数运用【关键词搜索另一个表的内容】【二个单元格是否一致】
- 汽车品牌、资讯、出行App获取安装来源统计
- 使用android杀蚊子
- IDM 6.25build 21超精版/超晶版
- 荔枝财报背后:腾讯、字节跳动、快手们都盯上了在线音频
- uni-app开启消息通知
- 吐秀山下,菜子湖畔,一年四季,家乡盛景