我是新手,我正在尝试使用R来理解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
但这让我做了很多清理工作,我认为可以做得更好。
此致 //中号
编辑:对不起来感到抱歉,但我对此都不熟悉而且很困惑。遗憾的是,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")
答案 0 :(得分: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))
})
不幸的是,这不会选择不包含逗号的名称。
答案 1 :(得分: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)