2013-06-25 26 views
2

下午好,使用邏輯grep在Web中抓取文本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) 

現在我想查詢每個這些文本的單詞「放射性」。我在,如果這個詞在文中提到,並已使用邏輯grep命令找出根本感興趣的是:當我算在我們的名單包含單詞的項目數

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

「放射性」返回計數0:

count(radioactive) 
     x freq 
1 FALSE 3 

然而,網頁的各URL的粗略審查不過表明,第一個鏈接(http://dailymed.nlm.nih.gov/dailymed/lookup.cfm?ndc=0002-1200&start=1&labeltype=all)事實上確實含有放射性字。我們的「多文本」列表甚至包括放射性這個詞,儘管我們的grepl命令似乎沒有提到它。

任何想法我做錯了將不勝感激。

非常感謝,

克里斯

+0

你是否試圖用正則表達式解析HTML?也許你應該閱讀[this](http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454)。 – agstudy

回答

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 = TRUEgrep命令。

+0

謝謝 - 這個作品非常出色!您是否意識到有一種方法可以調整此代碼以執行多個grep查詢而無需重新解析文檔?我有大約十幾個字我正在尋找並使用上面的代碼爲他們每個人,我發現這是相當耗時的每個URL運行這12次。您是否意識到「嵌套」多個grep查詢並將輸出分配給數據框中的不同變量的方法? – Entropy

+1

@熵我編輯多個單詞的答案。 – agstudy

+0

這非常有幫助。謝謝。 – MatthewR