coderLMN / AutomatedDataCollectionWithR

《基于 R 语言的自动化数据采集技术》读者讨论区
28 stars 10 forks source link

第一个范例就跑不出来 #13

Open GreenEric opened 7 years ago

GreenEric commented 7 years ago
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' 

感谢

请问何解?

coderLMN commented 7 years ago

这个问题在前面的 说明:书中的一些示例代码只能作为参考 里提到了:

大家都知道,对于活跃的网站来说,定期改版页面是必须的。因此网页结构的变化也不可避免。本书中的代码只是根据在某个时间点对网页结构进行的分析而编写的,并不等于这些代码是长期有效的。

比如在第一章,濒危文化遗产地的维基百科网址 http://en.wikipedia.org/wiki/List_of_World_Heritage_in_Danger 用 htmlParse() 函数就会报错,这是因为维基百科已经启用了 https 安全协议,因此需要证书才能访问,读者可以参考 9.1.7 "通过 HTTPS 进行的连接" 中的内容,对原书代码进行修改。

可以考虑两种做法:

  1. 如果有一些技术基础的话,可以先往后阅读 9.1.7 的相关内容,然后再尝试修改代码;
  2. 不然的话,可以上网找一个有类似结构的网站,这样只需对示例代码进行微小的修改。
psaxcode commented 7 years ago

本书的配套网站貌似是存了wikipedia原来的页面,可以用它试验书里的代码 http://www.r-datacollection.com/materials/ch-1-introduction/worldheritagedanger.htm

coderLMN commented 7 years ago

噢,真的!我都没有注意。

@psaxcode 非常感谢提供这个信息,谢谢!

@GreenEric 可以参考一下。

zhaoyi1025 commented 7 years ago

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

提示有错误,老师能讲一下什么原因吗

coderLMN commented 7 years ago
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 ,所以无法处理数据。

yangchaojie00 commented 6 years ago

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

请问这个错误如何改正呀,谢谢

coderLMN commented 6 years ago

从这里看不出原因,你可以先看一下 yend_clean 的内容是否正常。