利用RCurl抓取AAPG的摘要

最近想练习一下正则,顺带偷懒,于是选择了用R来抓取期刊的摘要,做成endnote等格式的题录。 想想很简单,不外乎是抓取网页,然后解析内容,提取想要的内容,不过过程远比想象的复杂。

1、抓取网页

网上内容很多,随便搜索一下,搜到的一个博客介绍得非常好。

第一步:安装程序包。两行命令,不到一秒时间内完成:

require(XML)

require(RCurl)

第二步:抓取网页的源代码。只需要知道网址就OK了。程序包RCurl能自动为你做。命令两三行:

webpage<-getURL(link)

webpage <- readLines(tc <- textConnection(webpage)); close(tc)

pagetree <- htmlTreeParse(webpage, error=function(...){}, useInternalNodes = TRUE)

第三步:选定表格。网页上肯定不止一个表格,要什么样的,用html语言@限定

tablehead <- xpathSApply(pagetree, "//table//th", xmlValue) #这里是抓表格的标题。“”中是html语言

result<-xpathSApply(pagetree,"//table//td",xmlValue) #这里是表格内容。

依样画葫芦,很快实现这一步,代码都不用改

2、解析内容

实际上,如果对html、xml熟悉的话,应该很容易,可惜的是,我对他们一点都不熟悉,临时报佛脚,还好万能的搜索引擎让我找到了简易教程,显然,简易教程可以入门,使用中是远远不够的。于是,开始正则表达式的反复折腾。论文名称、页码、期数等都好办,最折腾人的是作者和摘要。

作者提取出来很容易,但是aapg提供的作者抓取出来是一串字符,类似于“san Zhang,si Li,and wu Wang”这样的格式,所以不仅需要把他们劈分开成单个的人名,还需要调换一下姓和名的位置。

为了实现这个功能,前前后后琢磨了近一个月,最后用lappy和stringr配合下实现了,代码太烂,不过,能实现这个功能依然让我兴奋。。。。

利用正则表达式将连续多个空白字符替换成一个空格,会把回车也换成空格

authorname <- xpathSApply(pagetree, "//ul[@class='cit-first-element cit-auth-list']", xmlValue) authorname <- gsub("\s+"," ",authorname) authorname1 <- gsub(" $","",authorname)

按“,”,“and”将作者区分提取

authorname2 <- strsplit(authorname1,split = ",|, and | and ")

按endnote的格式要求,将姓放在前面,名放在后面

firstauthor <- lapply(authorname2,function(v) str_replace_all(v,".+\\s+","")) lastauthor1 <- lapply(authorname2,function(v) str_extract_all(v,".+\\s+")) lastauthor <- lapply(lastauthor1,function(v) paste(v,sep= " "))

摘要的抓取也是一个痛苦的过程,主要是很多文章的html源码中,其格式不一样,折腾死我。。。不到10期的文章,至少出现了三种形式,不知道怎么弄比较好,目前这种方式基本能提取到每篇文章的摘要,先凑合用。。。

可以使用contains语法,表明是“含有"某些属性

abs0 <- xpathSApply(abspagetree,"//div[contains(@class,'section intro')]|//div[contains(@class,'section abstract')]|//div[contains(@class,'section other')]|//div[@class='section'][@id='sec-1']",xmlValue) abs <- gsub("\\s+"," ",abs0)

3、合并输出题录

这一块总体上顺利,反正是用最笨的办法rbind一下,遇到的最大的麻烦是多个author,按endnote的格式,需要换行,一行一个作者的姓名,琢磨了半天,用paste里的collapse参数解决,将换行符号“\n"写进去,最后用writeLines输出文本。

4、其他

为了折腾完这个function,特意读了一本关于R中使用正则表达式的小书,是COS论坛推荐的,Handling and Processing Strings in R,一百来页的免费电子小书,业界良心,我居然能看明白,过去10个单词里至少要用翻译软件查询七八个单词,现在反过来了,之需要查询两三个了,这个作者太厉害了,让我这种水平的人能读懂。读完以后情绪高涨,又开始读另外一本外文小书Web Application Development with R Using Shiny ,而可怜的IntroductiontoLinearAlgebra4th_Strang,我又把你放下了,停留在第40页。。。。

抓取网页用到的参考网页

  • http://blog.sina.com.cn/s/blog_612248b00101dv0y.html

  • http://www.52ml.net/14685.html

  • http://yangliufr.com/r-camera-top-ten

  • http://yangliufr.com/use-r-to-analyse-literatures-to-get-a-research-trend

利用RCurl抓取AAPG的摘要” 中有 5 条评论

  1. 原来你看过我的博客啊。文中的所引用的我的链接有变,去掉.com后面的日期就好。 感觉你的思路和自学R的过程和我很相像。

    1. 链接已修改。我是读了你的博客,才觉得可以自己做一些相近的简单任务的,不过我还没有达到你那种水平,也没想过做深入,太懒了,岁数也大了,做什么都浅尝辄止。

    1. 一点都不专业。。。就是乱,正则处理过来处理过去的。。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注