2013-06-25 2 views
2

안녕하세요,논리적 grep을 사용하는 웹 스크랩 텍스트 R

이 질문에 대한 도움을 주셔서 감사합니다.

나는 근근이 살아가는 데 관심이있는 목록 내에> 5000 개의 URL 집합을 가지고 있습니다.

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) 

가 지금은 "방사성"라는 단어에 대해 이러한 텍스트의 각을 조회하고 싶습니다 : 나는 아래의 샘플 코드를 사용하여이 웹 페이지의 텍스트를 추출 lapply과 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가) 실제로 방사성 단어를 포함 않음을 알 수있다. 우리의 "multipleText"리스트에는 심지어 방사성이라는 단어가 포함되어 있습니다. 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 

추신 : 어쩌면 당신은 grep 명령 ignore.case = TRUE을 사용해야합니다.

+0

감사합니다 -이 작품은 훌륭하게 작동합니다! 문서를 다시 파싱하지 않고이 코드를 적용하여 여러 grep 쿼리를 수행하는 방법을 알고 있습니까? 내가 찾고있는 단어가 12 개 정도 있고 각각 위의 코드를 사용하면 각 URL에 대해이 12 번 각각을 실행하는 데 시간이 많이 걸리는 것을 발견했습니다. 여러 grep 쿼리를 "중첩 (nest)"하고 출력을 데이터 프레임의 다른 변수에 할당하는 방법을 알고 있습니까? – Entropy

+1

@Entropy 여러 단어에 대한 내 대답을 편집합니다. – agstudy

+0

이것은 매우 도움이됩니다. 고맙습니다. – MatthewR