【问题标题】:xpath node determinationxpath 节点确定
【发布时间】:2011-07-04 22:11:39
【问题描述】:

我对抓取完全不熟悉,我正在尝试使用 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

但这让我有很多清理工作要做,我认为可以做得更好。

问候, //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) 提供要从中选择节点的 XML 文档。 2) 说明您希望从提供的 XML 文档中选择哪些节点。
  • 即使在您编辑之后,这个问题也无法回答。我们不知道您的 XML 是什么样的,您也没有提供任何关于 e2kk 内容的示例或任何其他示例数据。
  • @Misha,做一个可重复的小例子。 XML 文件的淡化版本。

标签: r xpath


【解决方案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))
})

很遗憾,这不会选择不包含逗号的名称。

【讨论】:

    【解决方案2】:

    混合使用xpath 和字符串操作。

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

    检查包含页面源代码的parsed 变量告诉我们,作者没有明智地使用列表标签(如&lt;ul&gt;),而是将一段文本(&lt;p&gt;)用换行符(@ 987654326@)。我们使用 xpath 来检索 &lt;p&gt; 元素。

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

    现在我们转换为字符,在&lt;br&gt; 标签上拆分并删除空行。

    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)
    

    【讨论】:

    • 所以单独巧妙地使用 xpath 和 xmlvalue 给我留下一个名称向量是不可能的?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多