微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

xml – R:如何在站点时获取父属性和节点值?

我有一个像这样的html和R代码,需要将每个节点值与data.frame中的父id相关联.每个人都可以获得一些不同的信息.

example <- "<div class='person' id='1'>
<div class='phone'>555-5555</div>
<div class='email'>jhon@123.com</div>
</div>
<div class='person' id='2'>
<div class='phone'>123-4567</div>
<div class='email'>maria@gmail.com</div>
</div>
<div class='person' id='3'>
<div class='phone'>987-6543</div>
<div class='age'>32</div>
<div class='city'>New York</div>
</div>"

doc = htmlTreeParse(example,useInternalNodes = T)

values <- xpathSApply(doc,"//*[@class='person']/div",xmlValue)
variables <- xpathSApply(doc,xmlGetAttr,'class')
id <- xpathSApply(doc,"//*[@class='person']",'id')

# The problem: create a data.frame(id,variables,values)

使用xpathSApply(),我也可以获得电话,电子邮件和年龄值以及人物属性(id).但是,这些信息是孤立的,我需要将它们引用到正确的data.frame变量和正确的人.在我的实际数据中有很多不同的信息,因此命名每个变量的过程必须是自动的.

我的目标是创建一个像这样的data.frame,将每个id与其正确的数据相关联.

id variables          values
1  1     phone        555-5555
2  1     email    jhon@123.com
3  2     phone        123-4567
4  2     email maria@gmail.com
5  3     phone        987-6543
6  3       age              32
7  3      city        New York

我相信我必须创建一个在xpathSApply中使用的函数,这个函数同时会获得个人电话和人员ID,因此它们会相关,但到目前为止我还没有取得任何成功.

谁能帮我?

解决方法

一般来说,这并不容易:

idNodes <- getNodeSet(doc,"//div[@id]")
ids <- lapply(idNodes,function(x) xmlAttrs(x)['id'])
values <- lapply(idNodes,xpathApply,path = './div[@class]',xmlValue)
attributes <- lapply(idNodes,xmlAttrs)
do.call(rbind.data.frame,mapply(cbind,ids,values,attributes))
  V1              V2    V3
1  1        555-5555 phone
2  1    jhon@123.com email
3  2        123-4567 phone
4  2 maria@gmail.com email
5  3        987-6543 phone
6  3              32   age
7  3        New York  city

上面将给出属性和值对,假设它们嵌套在具有关联id的div中.

更新:
如果要将其包装在xpathApply类型的调用

utilFun <- function(x){
  id <- xmlGetAttr(x,'id')
  values <- sapply(xmlChildren(x,omitNodeTypes = "XMLInternalTextNode"),xmlValue)
  attributes <- sapply(xmlChildren(x,xmlAttrs)
  data.frame(id = id,attributes = attributes,values = values,stringsAsFactors = FALSE)
}
res <- xpathApply(doc,'//div[@id]',utilFun)
do.call(rbind,res)
  id attributes          values
1  1      phone        555-5555
2  1      email    jhon@123.com
3  2      phone        123-4567
4  2      email maria@gmail.com
5  3      phone        987-6543
6  3        age              32
7  3       city        New York

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。