【问题标题】:Scrape and Loop with Rvest使用 Rvest 进行刮擦和循环
【发布时间】:2019-05-09 18:42:34
【问题描述】:

我已经查看了与此类似主题相关的 SO 上类似问题的几个答案,但似乎都不适合我。

(loop across multiple urls in r with rvest)

(Harvest (rvest) multiple HTML pages from a list of urls)

我有一个 URL 列表,我希望从每个 URL 中获取表格并将其附加到主数据框。

## get all urls into one list
page<- (0:2)
urls <- list()
for (i in 1:length(page)) {
  url<- paste0("https://www.mlssoccer.com/stats/season?page=",page[i])
  urls[[i]] <- url
}


### loop over the urls and get the table from each page
table<- data.frame()
for (j in urls) {
  tbl<- urls[j] %>% 
    read_html() %>% 
    html_node("table") %>%
    html_table()
  table[[j]] <- tbl
}

第一部分按预期工作并获取我要抓取的网址列表。我收到以下错误:

 Error in UseMethod("read_xml") : 
  no applicable method for 'read_xml' applied to an object of class "list"

有关如何纠正此错误并将 3 个表循环到单个 DF 中的任何建议?我很感激任何提示或指示。

【问题讨论】:

  • 您是否尝试在 for 循环外分配 j &lt;- 1,然后在 table[[j]] &lt;- tbl 参数之后在 for 循环内分配 j &lt;- j+1

标签: r for-loop web-scraping rvest


【解决方案1】:

试试这个:

library(tidyverse)
library(rvest)

page<- (0:2)
urls <- list()
for (i in 1:length(page)) {
  url<- paste0("https://www.mlssoccer.com/stats/season?page=",page[i])
  urls[[i]] <- url
}

### loop over the urls and get the table from each page
tbl <- list()
j <- 1
for (j in seq_along(urls)) {
  tbl[[j]] <- urls[[j]] %>%   # tbl[[j]] assigns each table from your urls as an element in the tbl list
    read_html() %>% 
    html_node("table") %>%
    html_table()
  j <- j+1                    # j <- j+1 iterates over each url in turn and assigns the table from the second url as an element of tbl list, [[2]] in this case
}

#convert list to data frame
tbl <- do.call(rbind, tbl)

table[[j]] &lt;- tbl 在原始代码中 for 循环的末尾是不必要的,因为我们将每个 url 分配为 tbl 列表的元素:tbl[[j]] &lt;- urls[[j]]

【讨论】:

  • 谢谢@on_an_island。正是我正在寻找的输出。
  • 我知道这不是最好的方法,但是,我怎样才能在表格中添加一列,显示使用了什么“j”? (我正在调整解决方案)
  • @AdilsonVCasula 只需在j &lt;- j+1 之前直接添加tbl[[j]]$j &lt;- j。这将附加一个带有jth 值的列。或者您可以通过将html_table() 替换为html_table() %&gt;% mutate(j = j) 来改变列。
【解决方案2】:

这是你的问题:

for (j in urls) {
  tbl<- urls[j] %>% 

当您使用j in urls 时,j 的值不是整数,它们本身就是 url。

试试:

for (j in 1:length(urls)) {
  tbl<- urls[[j]] %>% 
    read_html() %>% 
    html_node("table") %>%
    html_table()
  table[[j]] <- tbl
}

你也可以使用seq_along():

for (j in seq_along(urls))

【讨论】:

  • 这似乎解决了原始问题,但它会产生一个我不明白的新错误。 " [[tmp, j, value = list(list(Player = c("Diego Rubio", : 替换有 1 行,数据有 0" – Brad_J) 25 分钟前
猜你喜欢
  • 1970-01-01
  • 2013-09-21
  • 2017-08-31
  • 1970-01-01
  • 2018-12-07
  • 2017-01-30
  • 2020-04-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多