xpath节点确定

时间:2011-07-04 22:11:40

标签: r xpath

我是新手,我正在尝试使用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")

2 个答案:

答案 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)