启动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的解释:
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吧