使用RCurl爬虫爬取网页内容htmlParse解析时出现乱码

启动R,由于之前没有使用过RCurl,因此还需要加载RCurl包。但注意 library(RCurl) 之前先要 librar(bitops),否则不会成功。

使用XML包直接解析网页中的table标签,获取数据,library(XML)。

爬取的网址为 http://www.tianqihoubao.com/aqi/handan-201602.html

查看网页源代码可以发现网页有table标签,且数据都包含在该标签内

上代码:

library(bitops)
library(RCurl)
url = "http://www.tianqihoubao.com/aqi/handan-201602.html"    
temp = getURL(url)

查看 temp 时发现里面的汉字出现了乱码:

> temp
[1] "\r\n<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\r\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\r\n<head id=\"Head1\"><title>\r\n\t2016<c4>ê2<d4><c2>oaμ|<bf><d5><c6><f8><d6>êá<bf><d6><b8>êy2é<d1>ˉ(AQI)_2<d4><c2>·Yoaμ|PM2.5àúê·êy<be>Y2é<d1>ˉ_ìì<c6><f8>oó±¨\r\n</title>

于是又重新查看该网页的源代码,确定其编码方式。但是。。。

<meta name="Keywords" content="邯郸空气质量指数查询,河北邯郸AQI查询,历史数据,邯郸PM2.5指数" /><meta name="description" content="天气后报网提供河北邯郸2016年2月份空气质量指数查询,2016年2月邯郸PM2.5指数查询,数据包括秦皇岛空气污染指数、PM2.5历史数据、空气质量等级、AQI指数、污染物浓度等数据指标" /></head>
竟然没有写编码方式。。好吧,那我就自己猜猜吧

改代码为:temp = getURL(url,.encoding="GBK")

惊喜的发现出现了汉字,没有了乱码

> temp
[1] "\r\n<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\r\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\r\n<head id=\"Head1\"><title>\r\n\t2016年2月邯郸空气质量指数查询(AQI)_2月份邯郸PM2.5历史数据查询_天气后报\r\n</title>

Go on 继续~  先用XML包中的htmlParse()解析网页,由于人为网页编码格式是GBK的,所以就在encoding中添入了GBK,然后再用readHTMLTable()获取网页中 table 标签中的内容

doc <- htmlParse(temp, encoding="GBK", asText=T)    # 解析 temp 中的网页代码

tables <- readHTMLTable(doc, header=T)                       #获取网页中 table 标签内的数据

貌似一切顺利啊,查看tables中的内容

好吧,看样子不可以解决,于是又尝试了“UTF-8”,“ISO-8859-1”,“GB2312”等等 都是乱码。于是我又纠结了,上网谷歌,看到了一个这样的解释:

【记录】尝试用R语言去抓取网页和提取信息

使用帮助查看htmlParse官方文档中的encoding的解释:

encoding

a character string (scalar) giving the encoding for the document. This is optional as the document should contain its own encoding information. However, if it doesn’t, the caller can specify this for the parser. If the XML/HTML document does specify its own encoding that value is used regardless of any value specified by the caller. (That’s just the way it goes!) So this is to be used as a safety net in case the document does not have an encoding and the caller happens to know theactual encoding.

意思是:

如果HTML中本身已经指定了编码(此处就是,但是有2个charset。。。前一个是GB2312,后一个是UTF-8)

那么就会 强制 使用HTML中内部指定的编码而忽略调用者(此处我们的代码所传入的GBK)

所以即使调用者指定了正确的HTML的编码,结果也还是使用HTML内部自己所指定的错误的编码(此处应该就是用了第二个charset,即UTF-8来解析的)从而导致乱码的。

差不多算是一个bug吧


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值