代码之家  ›  专栏  ›  技术社区  ›  Luis

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

  •  0
  • Luis  · 技术社区  · 7 年前

    我在一个网络爬虫项目中遇到了困难。我的问题是,我需要提取一些节点的信息,同时保存它们祖先的信息。

    例如,如果我想在维基百科页面中获取所有项目符号列表中的所有项目,我可以这样做:

    library(httr)
    library(XML)
    
    html = GET("https://en.wikipedia.org/wiki/Benz_Patent-Motorwagen")
    par = htmlParse(html)
    
    xpathSApply(par, "//ul/li", xmlValue)
    

    但我需要的是,每件物品都要与它来自保险商实验室的编号(顺序)配对。我的尝试是:

    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 回复  |  直到 7 年前
        1
  •  0
  •   Luis    7 年前

    回答我自己的问题。事实证明,我所需要的只是第二个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

    推荐文章