如何将网页抓取数据转换为数字?

时间:2017-09-03 10:49:01

标签: r type-conversion rvest

我正在尝试转换从图书存储区中删除的数据,将图书销售成数字数据,以便我可以绘制图形。

我的代码目前是:

selector <- ".rrp" 
library(rvest)
url <- "https://www.bookdepository.com/bestsellers"
doc <- read_html(url)
prices <- html_nodes(doc, selector)
html_text(prices)
library(readr)
Spiral <- read_csv("C:/Users/Ellis/Desktop/INFO204/Spiral.csv")
View(Spiral)

我试图清理数据:

text <- gsub('[$NZ]', '', Spiral) # removes NZ$ from data

但数据现在看起来像这样:

[1] "c(\"16.53\", \"55.15\", \"36.39\", \"10.80\", \"27.57\", \"34.94\", 
\"27.57\", \"22.06\", \"22.00\", \"16.20\", \"22.06\", \"22.06\", 
\"19.84\", \"19.81\", \"27.63\", \"22.06\", \"10.80\", \"27.57\", 
\"22.06\", \"22.94\", \"16.53\", \"25.36\", \"27.57\", \"11.01\", 
\"14.40\", \"15.39\")" 

当我尝试跑步时:

as.numeric(text)

我明白了:

Warning message:
NAs introduced by coercion

如何以这样的方式清理数据:NZ$从价格中删除,我可以绘制'清理数据'

2 个答案:

答案 0 :(得分:1)

您有一个包含代码的字符串,而不是数字。您需要先评估代码。

as.numeric(eval(parse(text=text)))
 [1] 16.53 55.15 36.39 10.80 27.57 34.94 27.57 22.06 22.00 16.20 22.06 22.06 19.84
[14] 19.81 27.63 22.06 10.80 27.57 22.06 22.94 16.53 25.36 27.57 11.01 14.40 15.39

答案 1 :(得分:1)

获得预期结果的几个选项:

# option 1
as.numeric(gsub('(\\d+.\\d+).*', '\\1', html_text(prices)))
# option 2
as.numeric(gsub('\\s.*$', '', html_text(prices)))
# option 3
library(readr)
parse_number(html_text(prices))

所有结果都是:

 [1] 21.00  9.99 31.49 19.49  6.49 13.50 22.49 11.99 11.49  7.99 10.99  7.99 10.99  9.99  7.99  9.99 11.49  8.49 11.99  9.99 14.95  8.99 20.13 13.50  8.49  6.49

注意:

  • 结果是以欧元为单位的价格向量。由于本地化价格可能因您从另一个县刮掉而有所不同。
  • 当小数点检者在,中为逗号(html_text(prices))时,前两个选项可以更改为as.numeric(gsub('(\\d+),(\\d+).*', '\\1.\\2', html_text(prices)))以获得正确的结果。在这种情况下,第三个选项应更改为:parse_number(html_text(prices), locale = locale(decimal_mark = ','))