2014-11-19 53 views
5

निम्नलिखित यूआरएल आंकड़े और मेज (हैं), और मैं एक तालिका के पहले दो कॉलम पढ़ना पसंद पर XPathSApply कंडीशनिंग का उपयोग कर डेटा। xpatahSApply कमांड ठीक काम कर रहा है, लेकिन मुझे दो से अधिक विशेषताओं पर शर्त की आवश्यकता है और मैं इसे समझने में असमर्थ हूं।निकालने से अधिक विशेषता

url ="http://floodobservatory.colorado.edu/SiteDisplays/1544data.htm" 

doc=htmlTreeParse(url,useInternal=TRUE) 

पार्स डेटा का नमूना

<tr height="20" style="height:15.0pt"> 
<td height="20" class="xl6521398" align="right" style="height:15.0pt">11-Oct-13</td> 
    <td class="xl7321398">1853</td> 
    <td class="xl7321398"></td> 
    <td class="xl8121398">0.80</td> 
    <td class="xl7221398" align="right">4.87</td> 
    <td class="xl1521398"></td> 
    <td class="xl1521398"></td> 
    <td class="xl1521398"></td> 
    <td class="xl1521398"></td> 
    <td class="xl1521398"></td> 
    <td class="xl1521398"></td> 
    <td class="xl7421398"></td> 
    <td class="xl7421398"></td> 
    <td class="xl7421398"></td> 
    <td class="xl7421398"></td> 
    <td class="xl9621398"></td> 
    <td class="xl7421398"></td> 
    <td class="xl8121398"></td> 
</tr> 

मैं दो कोशिकाओं एक तारीख से मेल खाती है और अन्य एक streamflow मुक्ति से मेल खाती है और विशेषताओं का उल्लेख नीचे किया गया है जिनमें से से मूल्यों को पढ़ने की जरूरत है

<td height="20" class="xl6521398" ...> and [<td class="xl7321398"..] 

उपरोक्त नमूना डेटा के संबंध में, मुझे "1" 1-अक्टूबर -13 "और" 1853 "।

मैं निम्न कमांड का इस्तेमाल किया 'दिनांकों' और 'streamflow मुक्ति' पाने के लिए।

dates=xpathSApply(doc,"//td[@class='xl6521398']",xmlValue) 

streamflowdischarge=xpathSApply(doc,"//td[@class='xl7321398']",xmlValue) 

वे सफलतापूर्वक जानकारी निकाली गई, लेकिन निकाले मूल्यों अन्य तालिकाओं/कोशिकाओं से मिलकर बनता है मान, और महत्वपूर्ण बात 'तारीखें' और 'streamflow मुक्ति' अनुरूप नहीं है।

दिनांकों [01:10] [1] "1-Jan-98" "2-जन-98" "3-जन-98" "31 मार्च 98" "4-जन-98 "" 30-अप्रैल 98 "" 5-जन-98 " [8]" 31 मई-98 "" 6 जनवरी-98 "" 30 जून 98 "

" 31-मार्च -98 3-जन-98 "और" 4-जन-98 "के बीच" "- कुछ अनायास ही

streamflowdischarge [01:10] [1]" 3108 "" 3076 "" 3051 "" 3111 "" 3064 "" 3043 "" 3007 "" 3066 "" 378 "" "

"3108" को "1-Jan-98" अनुरूप नहीं है - यूआरएल

ऐसा लगता है कि टेबल/ही गुण है, जो मैंने पढ़ा/हड़पने नहीं करना चाहती के साथ कोशिकाओं की तरह देखते हैं पर जाँच की जा सकती। इस संबंध में, मैं मैं पूरी विशेषता उत्तीर्ण करने की आवश्यकता है, अर्थात लगता है,

<td height="20" class="xl6521398" align="right" style="height:15.0pt"> 

'तारीख' प्राप्त करने के लिए, और किसी भी तरह मैं ऐसे हालत चाहिए कि एक ही मेज से 'streamflow मुक्ति' निकाला जाता है।

बहुत सुझावों की कद्र करते हैं, और भी अगर कोई अन्य विकल्प उपलब्ध हैं।

मैं readHTMLTable कोशिश की, लेकिन एक त्रुटि "सीमा से बाहर सबस्क्रिप्ट"

धन्यवाद मिला, सतीश

उत्तर

3

मैं इनपुट डेटा

url = "http://floodobservatory.colorado.edu/SiteDisplays/1544data.htm" 
html = htmlParse(url) 

तो सेल वर्ग आप में रुचि रखते हैं के दोनों युक्त तालिका पंक्तियों के लिए क्वेरी की, पहले या प्रत्येक

query = "//tr[./td[@class='xl6521398'] and ./td[@class='xl7321398']]/td[1]" 
dates = xpathSApply(html, query, xmlValue) 
query = "//tr[./td[@class='xl6521398'] and ./td[@class='xl7321398']]/td[2]" 
flows = xpathSApply(html, query, xmlValue) 
के दूसरे सेल लेने

ये मुझे लगता है कि आप क्या चाहते हैं

> df = data.frame(dates=as.Date(dates, "%e-%b-%y"), flows=as.integer(flows)) 
> nrow(df) 
[1] 5808 
> head(df, 3) 
    dates flows 
1 1-Jan-98 1258 
2 2-Jan-98 1584 
3 3-Jan-98 1272 
> tail(df, 3) 
     dates flows 
5806 23-Nov-13 2878 
5807 24-Nov-13 2852 
5808 25-Nov-13 2738 

मुझे लगता है कि रहस्य ब्याज के दो कॉलम के साथ पंक्तियों के चयन का उपयोग करना था (?? लेकिन हो सकता है कि ये वेब पेज बनाने के लिए उपयोग की जाने वाली स्प्रेडशीट द्वारा उत्पन्न कक्षाएं हों, और डेटा के अर्थपूर्ण अर्थ से कोई लेना देना नहीं है?) डेटा को समूहबद्ध करने के लिए। एक और अधिक 'पूर्ण' scraping पंक्तियों की एक नोड सेट जैसे तिथि बना सकता है, और उसके बाद ब्याज की कक्षा के साथ लेबल कॉलम (कभी कभी कई के लिए) पंक्तियों क्वेरी,,

query = "//tr[./td[@class='xl6521398'] and ./td[@class='xl7321398']]" 
nodes = getNodeSet(html, query) 
date = lapply(nodes, xpathSApply, "./td[@class='xl6521398']", xmlValue) 
flow = lapply(nodes, xpathSApply, "./td[@class='xl7321398']", xmlValue) 

और प्रवाह तत्वों का समन्वय कर रहे हैं , लेकिन प्रति तिथि कई प्रवाह माप हो सकते हैं।

> head(flow, 3) 
[[1]] 
[1] "1258" ""  "1799" "2621" "1258" 

[[2]] 
[1] "1584" ""  "1550" "2033" "978" 

[[3]] 
[1] "1272" ""  "1104" "3515" "233" 

> table(sapply(flow, length)) 

    2 3 5 
5577 15 216 

तो मुझे लगता है कि यह सूडान में ब्लू नाइल के लिए है; साफ

url = "http://floodobservatory.colorado.edu/SiteDisplays/Summary5.htm" 
sites = htmlParse(url) 

> sites["//tr[./td[1] = '1544']"] 
[[1]] 
<tr height="17" style="height:12.75pt"><td height="17" class="xl7226158" style="height:12.75pt">1544</td>&#13; 
    <td class="xl6926158"/>&#13; 
    <td class="xl7026158">13.0940</td>&#13; 
    <td class="xl7026158">33.9750</td>&#13; 
    <td class="xl6926158">5070</td>&#13; 
    <td class="xl6926158">Blue Nile</td>&#13; 
    <td class="xl6926158">Sudan</td>&#13; 
    <td class="xl6926158">2</td>&#13; 
    <td class="xl6926158">2</td>&#13; 
    <td class="xl7926158">173%</td>&#13; 
    <td class="xl8226158">15.88</td>&#13; 
    <td class="xl7126158">19-Nov-14</td>&#13; 
    <td class="xl7126158"/>&#13; 
</tr> 

attr(,"class") 
[1] "XMLNodeSet" 
+0

बहुत विस्तृत समाधान, मुझे बहुत मदद की। मुझे लगता है कि वेबपृष्ठ एक्सेल शीट का उपयोग कर बनाया होगा। कोई विचार है कि पंक्ति के एक से अधिक टेबल सेल में समान वर्ग मूल्य क्यों है? दूसरा सवाल यह है कि: इस प्रकार का डेटा सेट पंक्तियों और कोशिकाओं की तालिका उत्पन्न करता है लेकिन सामग्री बच्चों के नोड्स के रूप में सहेजी नहीं जाएगी? सारांश 5.htm से संबंधित अन्य कोड भी उपयोगी है। बड़ी मात्रा में जानकारी – SatishR

+0

@SatishR मुझे नहीं पता कि स्प्रेडशीट कक्षा मूल्य को कैसे निर्धारित करता है। मुझे यकीन नहीं है कि 'सामग्री को' नोड्स के रूप में सहेजा नहीं जाएगा ', क्षमा करें। –

3

आप xpath भीतर and और | ऑपरेटरों का उपयोग कर सकते हैं:

path_xp <- '//td[@class="xl6521398" and @height="20"]|//td[@class="xl7321398"]' 

res <- xpathSApply(doc,path_xp,xmlValue) 
[1] "11-Oct-13" "1853"  "" 

ध्यान दें कि आप यहां 3 तत्व हैं क्योंकि आपके पास xl7321398 के बराबर विशेषता वर्ग के साथ 2 elments हैं। शायद आपको अपना अनुरोध अधिक सटीक करना चाहिए या आप केवल तीसरे खाली तत्व को स्थानांतरित कर सकते हैं।

res[nzchar(res)] 
[1] "11-Oct-13" "1853" 
+0

समाधान बहुत उपयोगी है, हालांकि, मैं जो चाहता हूं उसका उत्पादन नहीं करता था। उपर्युक्त आदेश केवल स्ट्रीमफ्लो डिस्चार्ज के साथ निकाले गए कक्ष (और दिनांक गुम है)। यह सोचकर कि "|" के कारण हो सकता है, मैंने इसे 'और' के साथ बदलने की कोशिश की लेकिन न तो यह मुझे परिणाम प्रदान किया। डेटा थोड़ा सा व्यवस्थित नहीं है, और इसके बजाय '2' तत्वों को अक्सर 'दिनांक' के बाद अक्सर '5' तत्व मिलते हैं। – SatishR

संबंधित मुद्दे