2013-08-13 4 views
5

मेरे पास एक HTML और आर कोड है और प्रत्येक नोड मान को अपने मूल आईडी में डेटा.फ्रेम में जोड़ने की आवश्यकता है। प्रत्येक व्यक्ति के लिए कुछ अलग जानकारी उपलब्ध है।आर: साइट के समय पर मूल गुण और नोड मान कैसे प्राप्त करें?

example <- "<div class='person' id='1'> 
<div class='phone'>555-5555</div> 
<div class='email'>[email protected]</div> 
</div> 
<div class='person' id='2'> 
<div class='phone'>123-4567</div> 
<div class='email'>[email protected]</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, "//*[@class='person']/div", xmlGetAttr, 'class') 
id <- xpathSApply(doc, "//*[@class='person']", xmlGetAttr, 'id') 

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

xpathSApply() के साथ, मैं फोन, ईमेल, और उम्र मूल्यों के रूप में अच्छी तरह से व्यक्ति जिम्मेदार बताते हैं (आईडी) भी रूप में प्राप्त कर सकते हैं। हालांकि, उन जानकारी को अलग कर दिया गया है और मुझे उन्हें सही डेटा.फ्रेम चर और सही व्यक्ति को संदर्भित करने की आवश्यकता है। मेरे वास्तविक डेटा में बहुत सारी जानकारी हैं, इसलिए प्रत्येक चर नामकरण की यह प्रक्रिया स्वचालित होनी चाहिए।

मेरा लक्ष्य डेटा आईडी बनाना है जैसे प्रत्येक आईडी को अपने उचित डेटा से संबंधित करना।

id variables   values 
1 1  phone  555-5555 
2 1  email [email protected] 
3 2  phone  123-4567 
4 2  email [email protected] 
5 3  phone  987-6543 
6 3  age    32 
7 3  city  New York 

मेरा मानना ​​है कि मैं xpathSApply अंदर उपयोग करने के लिए जो एक ही समय व्यक्ति फोन और व्यक्ति आईडी पर मिलेगा एक समारोह बनाना होगा, ताकि वे संबंधित हो जाएगा, लेकिन मैं के साथ किसी भी सफलता नहीं किया है अब तक

किसी को भी मेरी मदद कर सकते हैं?

उत्तर

7

सामान्य तौर पर इसकी आसान नहीं होने जा रहा:

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

ऊपर आप विशेषता दे देंगे और मूल्य जोड़े assumming वे एक संबद्ध id के साथ एक div में नेस्टेड रहते हैं।

अद्यतन: अगर आप एक xpathApply प्रकार कॉल में लपेट करना चाहते

utilFun <- function(x){ 
    id <- xmlGetAttr(x, 'id') 
    values <- sapply(xmlChildren(x, omitNodeTypes = "XMLInternalTextNode"), xmlValue) 
    attributes <- sapply(xmlChildren(x, omitNodeTypes = "XMLInternalTextNode"), 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 [email protected] 
3 2  phone  123-4567 
4 2  email [email protected] 
5 3  phone  987-6543 
6 3  age    32 
7 3  city  New York 
संबंधित मुद्दे