【问题标题】:R programming: rvest: for loop overwriting data scrapedR编程:rvest:for循环覆盖数据抓取
【发布时间】:2017-02-01 09:01:46
【问题描述】:

以下代码有效:

library(rvest)
library(plyr)

alaska <- c(1:49)

for (i in alaska) {

  url <- "http://www.50states.com/facts/alaska.htm"

  nodespath <- paste('//*[@id="content"]/div[1]/div[4]/ol/li[',i,']')

  alaskafacts <-  data.frame(facts =  url %>%   html() %>% 
                  html_nodes(xpath =nodespath) %>%   html_text())

 alaskafacts$nm <- i
 alaskafacts$facts <- alaskafacts$facts

 result <- rbind.fill(result,alaskafacts)
}

我会得到这个结果:

我知道循环正在工作,因为如果我将代码更改为:

alaska <- c(1:48)

我会得到这个结果:

我遇到的问题是循环自己重写。我期待 49 行事实——我猜循环会删除前一个事实,然后编写一个新事实——最后一个事实将始终是 data.frame 中的事实。

我在这里找到了一个示例:How can I use a loop to scrape website data for multiple webpages in R?,上面发布的代码遵循示例中的代码。然后我引用了这个例子:here。我认为上面的代码也遵循它。

我在底部的 rbind 调用遵循我在 SO 上找到的两个类似示例,但没有按预期保存。

有什么建议吗?


【问题讨论】:

    标签: r loops rvest


    【解决方案1】:

    您需要在 for 循环之前预定义结果变量。目前每次循环结果都被覆盖。试试这个:

    library(rvest)
    library(plyr)
    
    alaska <- c(1:49)
    result<-data.frame()
    for (i in alaska) {
    
      url <- "http://www.50states.com/facts/alaska.htm"
    ....
    

    有一种更快的方法可以在不使用 for 循环的情况下提取您请求的信息(并且事先知道所需的长度)。 rvest 被矢量化以允许在一个语句中拉出所有节点:

    library(rvest)
    
    url <- "http://www.50states.com/facts/alaska.htm"
    page<-url %>%   read_html()
    
    resultsarray<-html_text(html_nodes(page, "ol.stripedList li"))
      # "ol.stripedList li" is the html code for the list hierarchical 
      # li (list element underneath) an ol (ordered list) of class "stripedList" 
    

    resultsarray 是一个包含 49 个事实的字符串数组,我将允许您将其转换为所需的数据帧。

    【讨论】:

    • 完美运行。你怎么知道'ol.stripedList li'是我需要的?
    • 查看 html 代码以识别感兴趣的 html 代码块。有时有点反复试验。如果您查看 rvest 的小插图,它会解释如何使用“selectorgadget”工具来简化流程。
    • 如果我想遍历 states &lt;- c("all states") 和类似于 for (i in all states) 的所有状态,你是否仍然建议不要使用 for 循环——如果这是我的,我认为循环是必要的游戏问题。你怎么看?
    • 在这种情况下,我同意循环是最简单的。有一些方法可以将调用向量化到所有 50 个州。加载网页的时间是时间限制步骤,因此对于仅 50 个页面而言,矢量化页面加载所节省的时间不值得付出努力或降低可读性。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-02
    • 2017-07-15
    • 1970-01-01
    • 2015-02-03
    • 1970-01-01
    • 2016-10-24
    相关资源
    最近更新 更多