本节书摘来自华章出版社《R语言数据分析》一书中的第2章,第2.3节,作者盖尔盖伊·道罗齐(Gergely Daróczi),潘怡 译,更多章节内容可以访问云栖社区“华章计算机”公众号查看。
2.3 从HTML表中读取数据
万维网上传统的文本和数据以HTML页面为主,我们经常可以从例如HTML表找到一些有意思的信息,很容易就能通过复制和粘贴将数据转换成Excel电子表格,保存在磁盘上,稍后再导入到R中。但是这个过程比较费时间,也有点枯燥,因此可以考虑进行自动化处理。
可以借助前面提到过的客户反馈数据库的APIs来实现这一功能。如果我们不指定输出格式为XML格式或JSON格式,浏览器将默认返回一个HTML表格,输出结果如下图:
在R控制台中实现这个功能有点复杂,因为当使用curl时,浏览器将发送一些非默认的HTTP头,如果处理的是URL则简单返回一个JSON表。为了得到HTML格式,必须要让服务器知道我们期望的是HTML的输出格式,因此,需要在查询中设置合适的HTTP头:
XML包也提供了一个非常简单的办法实现从某个文档或指定结点来解析所有的HTML表,调用readHTMLTable函数,该函数将默认返回一个data.frames的list对象:
如果仅希望获得页面的第一张表,我们可以稍后设置res的过滤器或者设置readHTML-Table中which参数的值。以下两个R表达式效果相同:
从静态Web页面读取表数据
到目前为止,我们已经在同一个主题上变换了不少花样,但如果我们发现下载了一个完全不是前述任何一种流行的数据格式文件该怎么办?例如,有些人可能会对在CRAN上提供的R包感兴趣,这些包的列表可从http://cran.r-project.org/web/packages/available_packages_by_name.html处获得。我们又该如何完成这个任务?不调用RCurl或者指定客户头,我们也不需要先去处理文件,只需将URL传递给readHTMLTable即可:
readHTMLTable能够直接获得HTML页面,然后抽取所有的HTML表转换成data.frame对象,并返回有关它们的list内容。在下面的样例中,我们将只使用一个data.frame的list信息来获得所有包的名字和列的描述。
不过,str函数返回的文本信息所含信息量并不是很大,我们将快速介绍处理和可视化这类原始数据的方法,并通过CRAN上的R包来展示这些有些过量的特征。可以通过wordcloud包和tm包中一些奇妙的函数来创建一个关于包的描述的词组云:
这一简短的命令可以产生如下图所示的结果输出,它们代表了有关R包的描述中出现频率最高的词语。这些词语的位置没有特殊含义,但是通常词语的字体越大,意味着其出现频率越高。请参考屏幕截图的技术说明:
我们刚才是将第一个list对象的第二行字串传递到wordcloud函数,该函数将自动返回tm包对文本数据挖掘的结果。有关这一内容的详细说明,请参考本书第7章的内容。接下来,函数将根据这些词语在包描述中出现的频率赋予相应权重,然后根据权重确定其输出字体大小。看起来,R包确实都是首先关注构建模型并对数据应用不同的测试。