2013-11-09 3 views
0

각 앵커 태그 안에있는 링크의 문자 벡터를 반환하는 데 XPath를 사용하고 싶습니다.XPath 쿼리를 사용하여 R의 문자 벡터 목록을 얻으려면 어떻게해야합니까?

나는

library(RCurl) 
library(XML) 
url <- "http://dps.alaska.gov/sorweb/aspx/sorcra1.aspx" 
readHTMLTable(url, useInternalNodes = T)[[3]] 

에 관심있는 테이블을 반환 할 수 있지만, 나는 또한 이름과 관련된 각 앵커 태그의 링크를 반환합니다. 이것은 내가 지금까지 가지고있는 것이다.

dat <- htmlTreeParse(url, useInternalNodes = T) 
getNodeSet(dat, "///tr/td/a") 

그래서 내 출력은 RCurl의 목록 대신 원하는 문자 벡터의 객체와 나는 불완전한 XPath를 내 테이블에있는 것 이외의 다른 태그를 포함했다입니다.

제 질문은 두 부분입니다. getNodeSet 요소 출력을 태그가있는 문자 벡터로 변환하고 원하는 XPath 검색을 효율적으로 수행하는 방법은 무엇입니까?

답변

2

getNodeSet에 의해 반환 된 개체가 재미 있다고 생각됩니다. print() 할 때, 당신은 멋지게 형식화 된 문자열 표현을 얻게됩니다. 그러나 as.character()를 시도 할 때, 그것은 폭발적입니다.

직접적인 방법은 print.XMLInternalNode 함수의 코드를 검사하여 그 결과를 확인하는 것입니다.

> getAnywhere(print.XMLInternalNode) 
A single object matching ‘print.XMLInternalNode’ was found 
It was found in the following places 
    registered S3 method for print from namespace XML 
    namespace:XML 
with value 

function (x, ...) 
{ 
    cat(as(x, "character"), "\n") 
} 
<environment: namespace:XML> 

아 하! 반환 된 XMLInternalNode 객체는 S4이므로 일반적인 as.whatever() S3 메서드가 설정되어 있지 않습니다. 그래서

, 나는 이런 식으로 뭔가 할 줄 문자 벡터로 모든 결과를 얻을 수 :

> dat <- htmlTreeParse(url, useInternalNodes=T) 
> x<-getNodeSet(dat,"///tr/td/a") 
> sapply(x, function(n) {as(n, "character")}) 

질문의 두 번째 부분에 관해서를, 나는 XPath 쿼리의 권리를 최적화에 대해 걱정하지 않는 것이 좋습니다 것입니다 지금. 먼저 물건을 먼저 사용하십시오. 일단 모든 것이 작동하면, 충분히 빠르면 완료됩니다. 그렇지 않은 경우 코드를 프로파일 링하여 병목 현상이 어디인지 판단하십시오. 느려지는 XPath조차되지 않을 수도 있습니다 (단지 짐작할 수 있지만 웹 서버에서 페이지를 검색하는 데 걸리는 시간은 아마도 실행 시간에서 가장 큰 부분 일 것입니다).

+0

안녕하세요. 개인 응답에 감사드립니다. :) – cylondude