第一个范例就跑不出来
library(stringr)
library(XML)
library(maps)
surl <- "https://en.wikipedia.org/wiki/List_of_World_Heritage_in_Danger"
heritage_parsed <- htmlParse(surl,encoding="UTF-8")
tables <- readHTMLTable(heritage_parsed,stringsAsFactors=FALSE)
在surl中,如果按照原文是http,就出来以下错误
> heritage_parsed <- htmlParse(surl,encoding="UTF-8")
Error: failed to load external entity "http://en.wikipedia.org/wiki/List_of_World_Heritage_in_Danger"
如果改为https,就成了这样,
> Warning message:
XML content does not seem to be XML: 'https://en.wikipedia.org/wiki/List_of_World_Heritage_in_Danger'
感谢
请问何解?
这个问题在前面的 说明:书中的一些示例代码只能作为参考 里提到了:
大家都知道,对于活跃的网站来说,定期改版页面是必须的。因此网页结构的变化也不可避免。本书中的代码只是根据在某个时间点对网页结构进行的分析而编写的,并不等于这些代码是长期有效的。
比如在第一章,濒危文化遗产地的维基百科网址 http://en.wikipedia.org/wiki/List_of_World_Heritage_in_Danger 用 htmlParse() 函数就会报错,这是因为维基百科已经启用了 https 安全协议,因此需要证书才能访问,读者可以参考 9.1.7 "通过 HTTPS 进行的连接" 中的内容,对原书代码进行修改。
可以考虑两种做法:
- 如果有一些技术基础的话,可以先往后阅读 9.1.7 的相关内容,然后再尝试修改代码;
- 不然的话,可以上网找一个有类似结构的网站,这样只需对示例代码进行微小的修改。
本书的配套网站貌似是存了wikipedia原来的页面,可以用它试验书里的代码 http://www.r-datacollection.com/materials/ch-1-introduction/worldheritagedanger.htm
噢,真的!我都没有注意。
@psaxcode 非常感谢提供这个信息,谢谢!
@GreenEric 可以参考一下。
danger_table$scrit NULL danger_table$scrit<- ifelse(str_detect(danger_table$scrit,"Natural")==TRUE,"nat","cult") Error in
$<-.data.frame(*tmp*, "scrit", value = logical(0)) : replacement has 0 rows, data has 44
提示有错误,老师能讲一下什么原因吗
danger_table$scrit
NULL
说明你前面的代码执行不成功,没有取到正确的表格。我看到的 danger_table$crit 内容是这样的:
> danger_table$crit
[1] "Cultural:\n(iv)" "Natural:\n(vii), (ix), (x)"
[3] "Cultural:\n(iii)(iv)" "Cultural:\n(i)(iii)(vi)"
[5] "Cultural:\n(i)(ii)(iii)(iv)(vi)" "Cultural:\n(iii)(iv)(v)"
[7] "Cultural:\n(iii), (iv)" "Cultural:\n(iv)"
[9] "Natural:\n(vii), (ix), (x)" "Cultural:\n(i), (iii)"
[11] "Cultural:\n(iv), (vi)" "Natural:\n(ix), (x)"
[13] "Cultural:\n(iv), (v)" "Cultural:\n(ii)(iv)"
[15] "Cultural:\n(i), (ii), (iii), (iv), (vi)" "Natural:\n(ix)"
[17] "Natural:\n(viii), (ix), (x)" "Cultural:\n(i), (iv)"
[19] "Cultural:\n(ii), (iii), (iv)" "Natural:\n(vii), (x)"
[21] "Cultural:\n(iii), (iv)" "Cultural:\n(ii), (iv), (vi)"
[23] "Natural:\n(x)" "Cultural:\n(ii), (iii), (iv)"
[25] "Natural:\n(ix), (x)" "Natural:\n(ix), (x)"
[27] "Cultural:\n(ii), (iii), (iv)" "Cultural:\n(ii), (iii), (iv)"
[29] "Natural:\n(ix), (x)" "Natural:\n(x)"
[31] "Natural:\n(x)" "Cultural:\n(ii), (iii), (vi)"
[33] "Natural:\n(ix), (x)" "Natural:\n(vii), (viii), (ix), (x)"
[35] "Cultural:\n(iii)" "Natural:\n(vii), (ix)"
[37] "Cultural:\n(ii), (iii), (iv)" "Natural:\n(vii), (x)"
[39] "Cultural:\n(i)(ii)(iv)" "Cultural:\n(ii), (iv), (v)"
[41] "Cultural:\n(ii), (iii), (iv)" "Cultural:\n(i), (iii),\n(iv), (vi)"
[43] "Natural:\n(vii), (ix), (x)" "Natural:\n(vii), (viii), (x)"
读取网页不成功如果是因为 wiki 网页改版为 https ,那么如前 @psaxcode 所述,可以用本书配套网站上缓存的 wiki 网页地址来代替 wikipedia 的网址。
更正
你的 danger_table$scrit 有误,$ 后面多了一个 s ,所以无法处理数据。
yend_clean <- unlist(str_extract_all(danger_table$yend, "[[:digit:]]{4}$")) danger_table$yend <- as.numeric(yend_clean) Error in
$<-.data.frame(*tmp*, yend, value = numeric(0)) : replacement has 0 rows, data has 54 yend_clean <- unlist(str_extract_all(danger_table$yend, "[[:digit:]]4$")) danger_table$yend <- as.numeric(yend_clean) Error in$<-.data.frame(*tmp*, yend, value = numeric(0)) : replacement has 0 rows, data has 54
请问这个错误如何改正呀,谢谢
从这里看不出原因,你可以先看一下 yend_clean 的内容是否正常。