2014-02-24 38 views
0

G'day Everyone,從網站提取人口數據;維基小鎮網頁

我正在尋找澳大利亞人口/居住的柵格圖層。我曾嘗試在網上找到一些免費的數據集,但無法找到有用的合作伙伴。我認爲這可能是有趣的嘗試和刮從維基百科的人口數據,並建立自己的柵格圖層。爲此,我嘗試從wiki獲取信息,但不知道有關html的任何內容對我沒有幫助。

這個想法是提供澳大利亞所有有維基頁面的城鎮的列表,並將適當的數據提取到data.frame中。

我可以將網頁源數據導入到R中,但我堅持如何提取我想要的特定數據。下面的代碼顯示我卡在哪裏,任何幫助將真正讚賞或一些提示在正確的方向。

我想我可能會使用readHTMLTable(),因爲在正常的網頁中,我想要的信息是在一張漂亮的表格中向右。但是當我使用這個函數時,我得到一個錯誤(下面)。當我獲得源信息時,有什麼方法可以指定此表嗎?

對不起,如果這個問題沒有多大意義,我不知道我在做什麼,當談到搜索HTML文件。

感謝您的幫助,非常感謝!

乾杯, 亞當

require(RJSONIO) 
    loc.names <- data.frame(town = c('Sale', 'Bendigo'), state = c('Victoria', 'Victoria')) 
    u <- paste('http://en.wikipedia.org/wiki/', 
     sep = '', loc.names[,1], ',_', loc.names[,2]) 
    res <- lapply(u, function(x) htmlParse(x)) 

錯誤,當我使用readHTMLTable:

tabs <- readHTMLTable(res[1]) 
    Error in (function (classes, fdef, mtable) : 
    unable to find an inherited method for function ‘readHTMLTable’ for signature ‘"list"’ 

例如,一些我需要看起來像這樣在HTML的東西中的數據。我的問題是我如何在HTML中指定這些位置?

/ <span class="geo">-38.100; 147.067 

title="Victoria (Australia)">Victoria</a>. It has a population (2011) of 13,186 
+0

res是一個列表。要訪問其元素使用'[['' – jdharrison

回答

1

res在這種情況下,你需要使用res[[1]]而不是res[1]來訪問它的元素返回一個列表。 在這些元素上使用readHTMLTable將爲您提供所有表。與地理信息的表格被包含在與class = "infobox vcard"一個表,你可以只提取這些表seperately然後將它們傳遞到readHTMLTable

require(XML) 
lapply(sapply(res, getNodeSet, path = '//*[@class="infobox vcard"]') 
     , readHTMLTable) 

如果你不熟悉的XPath的selectr包允許你使用CSS選擇器這可能更容易。

require(selectr) 
> querySelectorAll(res[[1]], "table span .geo") 
[[1]] 
<span class="geo">-38.100; 147.067</span> 

[[2]] 
<span class="geo">-38.100; 147.067</span> 
+0

謝謝jdharrison,這很好。 – Adam