从网站中提取人口数据;维基镇网页

时间:2014-02-24 23:03:50

标签: html r web-scraping gis rjsonio

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

1 个答案:

答案 0 :(得分:1)

res返回一个列表,在这种情况下,您需要使用res[[1]]而不是res[1]来访问其元素。 在这些元素上使用readHTMLTable将为您提供所有表。带有地理信息的表包含在class = "infobox vcard"的表中,您可以单独提取这些表,然后将它们传递给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>