2011-07-04 150 views
1

我都是新來抓取,我試圖用R理解xpath。我的目標是從這個網站創建一個人的向量。我可以使用它:xpath節點確定

r<-htmlTreeParse(e) ## e is after getURL 
    g.k<-(r[[3]][[1]][[2]][[3]][[2]][[2]][[2]][[1]][[4]]) 
    l<-g.k[names(g.k)=="text"] 
    u<-ldply(l,function(x) { 

     w<-xmlValue(x) 
     return(w) 
     }) 

但是,這很麻煩,我寧願使用xpath。我如何去引用上面詳述的路徑?有沒有這個功能,或者我可以提交我的路徑以某種方式引用如上?

從來就來

xpathApply(htmlTreeParse(e, useInt=T), "//body//text//div//div//p//text()", function(k) xmlValue(k))->kk 

但是,這給我留下了很多的清理做的,我認爲這是可以做到更好。

問候, //中號

編輯:對不起,unclearliness,但I'm所有新的這個和比較混亂。 XML文檔太大而不幸被粘貼。我想我的問題是除了使用視圖源之外,是否有一些簡單的方法可以找到這些節點/文檔結構的名稱?我接近了我所喜歡的東西:

getNodeSet(htmlTreeParse(e, useInt=T), "//p")[[5]]->e2 

給了我想要的東西的清單。但仍然在帶有br標籤的xml中。我想運行

xpathApply(e2, "//text()", function(k) xmlValue(k))->kk 

會提供一個列表,以後可能不列出。但是它提供了比e2顯示更多垃圾的列表。

有沒有辦法直接做到這一點:

xpathApply(htmlTreeParse(e, useInt=T), "//p[5]//text()", function(k) xmlValue(k))->kk 

鏈接到網頁:我正嘗試讓名,只有從頁面的名稱。

getURL("http://legeforeningen.no/id/1712") 
+1

非常不清楚的問題。 1)提供要從中選擇節點的XML文檔。 2)解釋您想要選擇的提供的XML文檔中的哪些節點。 –

+0

即使在編輯之後,這個問題也無法回答。我們不知道你的XML是什麼樣的,你也不提供任何'e2','kk'或其他任何示例數據的例子。 – Andrie

+0

@米沙,做一個可重複的小例子。淡化XML文件的版本。 –

回答

1

我結束了

xml = htmlTreeParse("http://legeforeningen.no/id/1712", useInternalNodes=TRUE) 

(無需RCurl),然後

sub(",.*$", "", unlist(xpathApply(xml, "//p[4]/text()", xmlValue))) 

(在XPath的子集),它留下了最後一行是不是一個名字。人們也可以用XML處理文本處理,但是可以在R層進行迭代。

n <- xpathApply(xml, "count(//p[4]/text())") - 1L 
sapply(seq_len(n), function(i) { 
    xpathApply(xml, sprintf('substring-before(//p[4]/text()[%d], ",")', i)) 
}) 

不幸的是,這並不包含不包含逗號的名稱。

0

使用的xpath和字串處理的混合物。

#Retrieve and parse the page. 
library(XML) 
library(RCurl) 
page <- getURL("http://legeforeningen.no/id/1712") 
parsed <- htmlTreeParse(page, useInternalNodes = TRUE) 

檢查的parsed變量,它包含了網頁的源告訴我們,而不是理智,用列表標籤(如<ul>),筆者只是把文本拆分與換行符第(<p>)(<br />)。我們使用xpath來檢索<p>元素。

#Inspection tells use we want the fifth paragraph. 
name_nodes <- xpathApply(parsed, "//p")[[5]] 

現在我們轉換爲字符,拆分對<br>標籤並刪除空行。

all_names <- as(name_nodes, "character") 
all_names <- gsub("</?p>", "", all_names) 
all_names <- strsplit(all_names, "<br />")[[1]] 
all_names <- all_names[nzchar(all_names)] 
all_names 

可選,獨立的人民和他們的位置的名稱。

strsplit(all_names, ", ") 

或者更喜歡stringr

str_split_fixed(all_names, ", ", 2) 
+0

因此,聰明地使用xpath和xmlvalue離開我的名字向量是不可能的? – Misha