最近想练习一下正则,顺带偷懒,于是选择了用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
原来你看过我的博客啊。文中的所引用的我的链接有变,去掉.com后面的日期就好。 感觉你的思路和自学R的过程和我很相像。
链接已修改。我是读了你的博客,才觉得可以自己做一些相近的简单任务的,不过我还没有达到你那种水平,也没想过做深入,太懒了,岁数也大了,做什么都浅尝辄止。
test!!!
你这些东西得有多专业呢?看不懂的说。
一点都不专业。。。就是乱,正则处理过来处理过去的。。