2014-11-19 19 views
5

Url sau có số liệu và bảng, và tôi muốn đọc hai cột đầu tiên của bảng. Lệnh xpatahSApply đang hoạt động tốt, nhưng tôi cần điều kiện trên nhiều hơn hai thuộc tính và tôi không thể tìm ra.trích xuất dữ liệu bằng cách sử dụng tính năng XPathSApply trên nhiều thuộc tính

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

doc=htmlTreeParse(url,useInternal=TRUE) 

mẫu của các dữ liệu phân tích cú pháp

<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> 

tôi cần phải đọc các giá trị từ hai tế bào trong đó có một tương ứng với ngày và một trong những khác tương ứng với dòng chảy xả và đã đề cập dưới đây thuộc tính

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

liên quan đến dữ liệu mẫu ở trên, tôi cần lấy "1 1-Oct-13 "và" 1853 ".

Tôi đã sử dụng các lệnh sau để nhận 'ngày' và 'xả luồng'.

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

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

Chúng trích xuất thành công thông tin, nhưng giá trị trích xuất bao gồm các giá trị từ các bảng/ô khác và quan trọng là 'ngày' và 'xả luồng' không tương ứng.

ngày [1:10] [1] "1-Jan-98" "2-Jan-98" "3-Jan-98" "31-Mar-98" "4-Jan-98 "" 30-Apr-98 "" 5-Jan-98 " [8]" 31-May-98 "" 6-Jan-98 "" 30-Jun-98 "

" 31-Mar -98" là giữa "3-Jan-98" và "4-Jan-98" - một cái gì đó ngoài ý muốn

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

"3108" không tương ứng với "1-Jan-98" - có thể được kiểm tra tại các url

Dường như có bảng/tế bào với cùng một thuộc tính, mà tôi không muốn đọc/lấy. Về vấn đề này, tôi nghĩ tôi cần phải vượt qua toàn bộ thuộc tính, ví dụ:

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

để có được những 'date', và bằng cách nào đó tôi nên đặt điều kiện như vậy mà 'xả dòng chảy' từ cùng một bảng được chiết xuất.

Rất nhiều đánh giá cao đề xuất và cũng có thể có các tùy chọn khác.

tôi đã cố gắng readHTMLTable, nhưng có một lỗi "subscript ngoài giới hạn"

Cảm ơn, Satish

Trả lời

3

tôi nhập dữ liệu

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

sau đó truy vấn cho các hàng bảng chứa cả hai lớp tế bào khiến bạn quan tâm, tham gia đầu tiên hoặc các tế bào thứ hai của mỗi

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) 

Đây là những gì tôi nghĩ những gì bạn muốn

> 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 

Tôi đoán bí mật là sử dụng lựa chọn các hàng với hai cột quan tâm (?? nhưng có lẽ đây là những lớp được tạo bởi bảng tính được sử dụng để tạo trang web và không có gì liên quan đến ý nghĩa ngữ nghĩa của dữ liệu?) để nhóm dữ liệu. Một hơn 'hoàn toàn' cào có thể tạo ra một bộ nút của các hàng, và sau đó truy vấn hàng (đối với thỉnh thoảng một vài) cột dán nhãn với các lớp quan tâm, ví dụ:

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) 

Ngày và chảy yếu tố này được phối hợp , nhưng có thể có một số phép đo lưu lượng mỗi ngày.

> 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 

Vì vậy, tôi đoán điều này là dành cho sông Nile xanh, ở Sudan; gọn gàng

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

Giải pháp rất chi tiết, đã giúp tôi rất nhiều. Tôi đoán quá rằng trang web có thể đã tạo bằng bảng excel. Bất kỳ ý tưởng nào tại sao có nhiều ô trong một hàng có cùng giá trị lớp? Câu hỏi khác là: loại tập dữ liệu này tạo ra bảng các hàng và các ô nhưng nội dung sẽ không được lưu dưới dạng nút con? Mã khác, liên quan đến Summary5.htm, cũng hữu ích. Số lượng lớn thông tin – SatishR

+0

@ SatishR Tôi không biết cách bảng tính xác định giá trị của lớp. Tôi không chắc chắn những gì bạn có nghĩa là bởi 'nội dung sẽ không được lưu như các nút trẻ em', xin lỗi. –

3

Bạn có thể sử dụng and| nhà khai thác trong vòng xpath:

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

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

Lưu ý rằng bạn có 3 yếu tố ở đây bởi vì bạn có 2 tầng lớp với lớp thuộc tính bằng xl7321398. Có lẽ bạn nên chính xác hơn yêu cầu của bạn hoặc bạn chỉ có thể di chuyển phần tử trống thứ ba.

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

Giải pháp rất hữu ích, tuy nhiên, không tạo ra những gì tôi muốn. Các lệnh trên chỉ trích xuất các ô chỉ với lưu lượng dòng chảy (và ngày bị thiếu). Nghĩ rằng nó có thể là do "|", tôi đã thử thay thế nó bằng 'và' nhưng không phải nó đã cho tôi kết quả. Dữ liệu là một chút không được tổ chức, và thay vào đó các phần tử '2' tôi thường có phần tử '5' sau 'ngày'. – SatishR

Các vấn đề liên quan