爬虫技术 -- 基础学习(五)解决页面编码识别(附c#代码)
实现从Web网页提取文本之前,首先要识别网页的编码,有时候还需要进一步识别网页所使用的语言。因为同一种编码可能对应多种语言,例如UTF-8编码可能对应英文或中文等语言。
识别编码整体流程如下:
(1)从WEB服务器返回的content type头信息中提取编码,如果是GB2312的编码要当GBK处理。
(2)从网页mate标签中识别字符编码,如果content type中的编码不一致,以meta中声明的编码为准。
(3)如果仍然无法确定网页所使用的字符集,需要从返回流的二进制格式判断。
(4)确定网页所使用的语言,往往采用统计的方法来估计网页的语言。
判断编码的完整过程如下:(c#代码)
/// <summary>
/// 函数名称:GetDataFromUrl
/// 功能说明:获取url指定的网页的源码
/// 参数:string url用于指定 url
/// 参数:ref Encoding encode用来获取网页中的字符集编码
/// </summary>
public static string GetDataFromUrl(string url, ref Encoding encode)
{
string str = string.Empty;
HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(url); //设置http头
request.AllowAutoRedirect = true;
request.AllowWriteStreamBuffering = true;
request.Referer = "";
request.Timeout = * ;
request.UserAgent = "";
HttpWebResponse response = null;
response = (HttpWebResponse)request.GetResponse(); //根据http应答的http头来判断编码
string characterSet = response.CharacterSet;
//Encoding encode;
if (characterSet != "")
{
if (characterSet == "ISO-8859-1")
{
characterSet = "gb2312";
}
encode = Encoding.GetEncoding(characterSet);
}
else
{
encode = Encoding.Default;
} //声明一个内存流来保存http应答流
Stream receiveStream = response.GetResponseStream();
MemoryStream mStream = new MemoryStream(); byte[] bf = new byte[];
int count = receiveStream.Read(bf, , );
while (count > )
{
mStream.Write(bf, , count);
count = receiveStream.Read(bf, , );
}
receiveStream.Close(); mStream.Seek(, SeekOrigin.Begin); //从内存流里读取字符串
StreamReader reader = new StreamReader(mStream, encode);
char[] buffer = new char[];
count = reader.Read(buffer, , );
while (count > )
{
str += new String(buffer, , count);
count = reader.Read(buffer, , );
} //从解析出的字符串里判断charset,如果和http应答的编码不一直
//那么以页面声明的为准,再次从内存流里重新读取文本
Regex reg =
new Regex(@"<meta[\s\S]+?charset=(.*?)""[\s\S]+?>",
RegexOptions.Multiline | RegexOptions.IgnoreCase);
MatchCollection mc = reg.Matches(str);
if (mc.Count > )
{
string tempCharSet = mc[].Result("$1");
if (string.Compare(tempCharSet, characterSet, true) != )
{
encode = Encoding.GetEncoding(tempCharSet);
str = string.Empty;
mStream.Seek(, SeekOrigin.Begin);
reader = new StreamReader(mStream, encode);
buffer = new char[];
count = reader.Read(buffer, , );
while (count > )
{
str += new String(buffer, , count);
count = reader.Read(buffer, , );
}
}
}
reader.Close();
mStream.Close();
if (response != null)
response.Close(); return str; }
爬虫技术 -- 基础学习(五)解决页面编码识别(附c#代码)的更多相关文章
- 爬虫技术 -- 基础学习(四)HtmlParser基本认识
利用爬虫技术获取网页源代码后,针对网页抽取出它的特定文本内容,利用正则表达式和抽取工具,能够更好地抽取这些内容. 下面介绍一种抽取工具 -- HtmlParser HtmlParser是一个用来解析H ...
- 爬虫技术 -- 基础学习(一)HTML规范化(附特殊字符编码表)
最近在做网页信息提取这方面的,由于没接触过这系列的知识点,所以逛博客,看文档~~看着finallyly大神的博文和文档,边看边学习边总结~~ 对网站页面进行信息提取,需要进行页面解析,解析的方法有以下 ...
- 爬虫技术 -- 基础学习(三)理解URL和URI的联系与区别
网络爬虫的基本操作是抓取网页.首先要了解下URL~~ 在理解URL之前,先了解下URI,这两个概念我曾经混淆过~@_@|| 什么是URI? Web上每种可用的资源,如:html文档.视频,图片等都由一 ...
- Python基础学习五
Python基础学习五 迭代 for x in 变量: 其中变量可以是字符串.列表.字典.集合. 当迭代字典时,通过字典的内置函数value()可以迭代出值:通过字典的内置函数items()可以迭代出 ...
- 解决页面初始化vue加载代码问题
<style type="text/css"> /* 解决页面初始化vue加载代码问题 */ [v-cloak] { display: none; } </sty ...
- 爬虫技术 -- 进阶学习(十)网易新闻页面信息抓取(htmlagilitypack搭配scrapysharp)
最近在弄网页爬虫这方面的,上网看到关于htmlagilitypack搭配scrapysharp的文章,于是决定试一试~ 于是到https://www.nuget.org/packages/Scrapy ...
- 爬虫技术 -- 进阶学习(九)使用HtmlAgilityPack获取页面链接(附c#代码及插件下载)
菜鸟HtmlAgilityPack初体验...弱弱的代码... Html Agility Pack是一个开源项目,为网页提供了标准的DOM API和XPath导航.使用WebBrowser和HttpW ...
- 爬虫技术 -- 进阶学习(七)简单爬虫抓取示例(附c#代码)
这是我的第一个爬虫代码...算是一份测试版的代码.大牛大神别喷... 通过给定一个初始的地址startPiont然后对网页进行捕捉,然后通过正则表达式对网址进行匹配. List<string&g ...
- 爬虫技术(六)-- 使用HtmlAgilityPack获取页面链接(附c#代码及插件下载)
菜鸟HtmlAgilityPack初体验...弱弱的代码... Html Agility Pack是一个开源项目,为网页提供了标准的DOM API和XPath导航.使用WebBrowser和HttpW ...
随机推荐
- 从range和xrange的性能对比到yield关键字(中)
上节提出了range和xrange的效率问题,这节我们来探究其中的原因 yield的使用 我们看下面的程序: #coding: utf-8 def test(): print 4 print ...
- Activiti 查看流程图
package com.mycom.processDefinition; import java.io.File; import java.io.IOException; import java.io ...
- Hadoop-2.6.0 + Zookeeper-3.4.6 + HBase-0.98.9-hadoop2环境搭建示例
1 基本信息 1.1 软件信息 hadoop-2.6.0 zookeeper-3.4.6 hbase-0.98.9-hadoop2 (以下示例中使用的操作系统是Centos 6.5,请将 ...
- C++ Data Member内存布局
如果一个类只定义了类名,没定义任何方法和字段,如class A{};那么class A的每个实例占用1个字节的内存,编译器会会在这个其实例中安插一个char,以保证每个A实例在内存中有唯一的地址,如A ...
- WHY数学图形可视化工具(开源)
WHY数学图形可视化工具 软件下载地址:http://files.cnblogs.com/WhyEngine/WhyMathGraph.zip 源码下载地址: http://pan.baidu.com ...
- 奇怪吸引子---Russler
奇怪吸引子是混沌学的重要组成理论,用于演化过程的终极状态,具有如下特征:终极性.稳定性.吸引性.吸引子是一个数学概念,描写运动的收敛类型.它是指这样的一个集合,当时间趋于无穷大时,在任何一个有界集上出 ...
- object-c学习1
因为公司需要,开始看object-c,虽然还没ios系统,但现学下语法. 第一个例子不应该是helloWorld吗?但<Learn Objective-C on the Mac>书上不是. ...
- 如何制作CSR文件?
如何制作CSR文件? 在申请数字证书之前,您必须先生成证书私钥和证书请求文件(CSR,Cerificate Signing Request),CSR是您的公钥证书原始文件,包含了您的服务器信息和您的单 ...
- 连上VPN后,如何访问内网(添加路由表实现网络分流方法)
route add 192.168.4.0 mask 255.255.255.0 192.168.2.0 metric 1 不止有“邮件系统”会出现这种情况,还有其他情况,这时,你需要在没有连接外网和 ...
- WP-PostViews的安装和设置方法
wordpress本身并没有文章浏览统计功能,必须借助插件.想要知道自己的文章被多数访客浏览,或者访客对哪些文章或者哪类文章更加有兴趣,这就是文章统计的重要性了.WP-PostViews插件是哥不错的 ...