2014-09-30 2 views
4

R에서 Xpath를 사용하여 html 문서의 노드를 검색하려고합니다. 아래 코드에서 노드가 검색 될 때 NULL 또는 NA를 반환하는 방법을 알고 싶습니다. 없는 : 나는 <first-name> 노드 중 하나를 삭제할 수 있다면 나는 저자에 xpathApply() 기능을 실행할 때R 내의 XPath : 노드가 없으면 NA를 반환합니다.

예를 들어
library(XML) 
b <- ' 
<bookstore specialty="novel"> 
<book style="autobiography"> 
<author> 
<first-name>Joe</first-name> 
<last-name>Bob</last-name> 
</author> 
</book> 
<book style="textbook"> 
<author> 
<first-name>Mary</first-name> 
<last-name>Bob</last-name> 
</author> 
<author> 
<first-name>Britney</first-name> 
<last-name>Bob</last-name> 
</author> 
<price>55</price> 
</book> 
<book style="novel" id="myfave"> 
<author> 
<first-name>Toni</first-name> 
<last-name>Bob</last-name> 
</author> 
</bookstore> 
' 
doc2 <- htmlTreeParse(b, useInternal=T) 
xpathApply(doc2, "//author/first-name", xmlValue) 

, 내가 4 개 결과를 얻을 것이다,하지만, 나는 xpathApply 함수는 NULL 또는 뭔가를 반환하려면 그 자리에 다른, 나는 그것을 건너 뛰고 싶지 않아. 당신이 뭔가를 할 수

Joe 
NA 
Britney 
Tony 
+0

는 R 지원 XPath는 2.0을합니까 ? 또는 단지 1.0? 그것은 최고의 대답을 결정하는 데 도움이 될 것입니다. – LarsH

+1

@LarsH 이미 좋은 답변이 있지만 FYI : SO (R 및 XPath 관련)에 대한 과거 토론에서 1.0 만 지원된다는 사실을 상기합니다. –

답변

4

: 나는 <first-name>Mary</first-name>을 삭제 인 경우 결과는 다음과 같이 할

xpathApply(doc2, "//author", 
      function(x){ 
      if("first-name" %in% names(x)) 
       xmlValue(x[["first-name"]]) 
      else NA}) 

[[1]] 
[1] "Joe" 

[[2]] 
[1] NA 

[[3]] 
[1] "Britney" 

[[4]] 
[1] "Toni" 
+0

익명 함수에 정규식, 아마도 grep ("Joe")를 넣어서 xpathApply가 "Joe"가있는 경우에만 이름 노드 값을 추출 할 수 있습니까? XPath 1.0은 regex를 자체적으로 지원하지 않습니다. translate()와 함께 서투르게 지원하지 않습니다. 그래서이 문제를 해결할 수 있습니까? – lawyeR

+0

@lawyeR 나는 당신이 뭘 원하지는 모르겠다. 물론 첫 번째 이름을 추출하기 위해'if ("first-name"% in % names (x) && grepl ("Joe", xmlValue (x [[first-name "]])) 노드가 있고 그 값에 "Joe"가 들어 있습니다. – agstudy

1

대체 방법 :

extractFirstName <- function(node) { 
    val <- unlist(xpathApply(node, "first-name", xmlValue)) 
    if (is.null(val)) { val <- NA } 
    val 
} 

xpathApply(doc2, "//author", extractFirstName) 

## [[1]] 
## [1] "Joe" 
## 
## [[2]] 
## [1] NA 
## 
## [[3]] 
## [1] "Britney" 
## 
## [[4]] 
## [1] "Toni" 
관련 문제