xml – R:如何在站点时获取父属性和节点值?
发布时间:2020-12-16 23:17:28 所属栏目:百科 来源:网络整理
导读:我有一个像这样的html和R代码,需要将每个节点值与data.frame中的父id相关联.每个人都可以获得一些不同的信息. example - "div class='person' id='1'div class='phone'555-5555/divdiv class='email'jhon@123.com/div/divdiv class='person' id='2'div class
我有一个像这样的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中. 更新: 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 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |