R中的XML:在存储祖先信息时提取节点

时间:2019-01-23 14:04:35

标签: r xml web-scraping

我在进行网络抓取项目时遇到了困难。我的问题是,我需要提取许多节点的信息,同时将信息保存在它们的祖先上。

例如,如果我要获取维基百科页面中所有项目符号列表中的所有项目,则可以执行以下操作:

library(httr)
library(XML)

html = GET("https://en.wikipedia.org/wiki/Benz_Patent-Motorwagen")
par = htmlParse(html)

xpathSApply(par, "//ul/li", xmlValue)

但是我需要的是将每个项目与其来源的ul的编号(顺序)配对。我的尝试如下:

library(httr)
library(XML)
library(data.table)

html = GET("https://en.wikipedia.org/wiki/Benz_Patent-Motorwagen")
par = htmlParse(html)  

dt = data.table(list_number = numeric(0), list_items = character(0))

for(i in 1:length(xpathSApply(par, "//ul"))){

  node = getNodeSet(par, "//ul")[[i]]
  list_items = xpathSApply(node, "/li", xmlValue)

  new = data.table(list_number = i, list_items)

  dt = rbind(dt, new)
}

但是它没有按我预期的那样工作。有什么建议吗?

1 个答案:

答案 0 :(得分:0)

在这里回答我自己的问题。事实证明,我所需要的只是一个“”。在第二个xpath中,以指示查询从从getNodeSet提取的节点开始,而不是从文档顶部开始。

library(httr)
library(XML)
library(data.table)

html = GET("https://en.wikipedia.org/wiki/Benz_Patent-Motorwagen")
par = htmlParse(html)  

dt = data.table(list_number = numeric(0), list_items = character(0))

for(i in 1:length(xpathSApply(par, "//ul"))){

  node = getNodeSet(par, "//ul")[[i]]
  list_items = xpathSApply(node, "./li", xmlValue)

  new = data.table(list_number = i, list_items)

  dt = rbind(dt, new)
}

https://stat.ethz.ch/pipermail/r-help//2009-March/416365.html