使用R中的逻辑grep Webscrape文本

时间:2013-06-25 23:20:46

标签: r

下午好,

感谢您帮我解决这个问题。

我在列表中有一组> 5000个URL,我有兴趣抓取。我使用lapply和readLines来使用下面的示例代码提取这些网页的文本:

multipleURL <- c("http://dailymed.nlm.nih.gov/dailymed/lookup.cfm?ndc=0002-1200&start=1&labeltype=all", "http://dailymed.nlm.nih.gov/dailymed/lookup.cfm?ndc=0002-1407&start=1&labeltype=all", "http://dailymed.nlm.nih.gov/dailymed/lookup.cfm?ndc=0002-1975&start=1&labeltype=all")
multipleText <- lapply(multipleURL, readLines)

现在,我想查询这些文本中的每一个单词&#34; radioactive&#34;。我只是想知道文本中是否提到了这个术语并使用了逻辑grep命令:

radioactive <- grepl("radioactive" , multipleText, ignore.case = TRUE)

当我计算列表中包含单词&#34;放射性&#34;的项目数时它返回0:

count(radioactive)
      x freq
1 FALSE    3

但是,对这些网址中的每个网页进行粗略审查后发现,第一个链接(http://dailymed.nlm.nih.gov/dailymed/lookup.cfm?ndc=0002-1200&start=1&labeltype=all)实际上包含放射性一词。我们的&#34; multipleText&#34; list甚至包括放射性这个词,虽然我们的grepl命令似乎没有把它拿起来。

对我所做错的任何想法都将不胜感激。

非常感谢,

克里斯

1 个答案:

答案 0 :(得分:4)

我认为您应该使用html parser解析文档。我在这里使用XML包。我将您的文档转换为R列表,然后我可以在其上应用grep

library(XML)
multipleText <- lapply(multipleURL,function(x) {
                       y <- xmlToList(htmlParse(x))
                       y.flat <- unlist(y,recursive=TRUE)
                       length(grep('radioactive',c(y.flat,names(y.flat))))
})

multipleText
[[1]]
[1] 8

[[2]]
[1] 0

[[3]]
[1] 0

编辑以搜索多重搜索:

## define your words here
WORDS <- c('CLINICAL ','solution','Action','radioactive','Effects')
library(XML)
multipleText <- lapply(multipleURL,
                       function(x) {
                         y <- xmlToList(htmlParse(x))
                         y.flat <- unlist(y,recursive=TRUE)
                         sapply(WORDS,function(y)     
                           length(grep(y,c(y.flat,names(y.flat)))))
                       })
do.call(rbind,multipleText)

     CLINICAL  solution Action radioactive Effects
[1,]         6       10      2           8       2
[2,]         1        3      1           0       3
[3,]         6       22      2           0       6

PS:也许您应该使用ignore.case = TRUE作为grep命令。