【问题标题】:R loop with html_nodes ( rvest ) isn´t catching all data带有 html_nodes ( rvest ) 的 R 循环没有捕获所有数据
【发布时间】:2018-05-10 12:35:55
【问题描述】:

我想用html_node做一个循环来捕捉一些节点的值(节点没有文本),也就是我有一些值

library(rvest)
country <- c("Canada", "US", "Japan", "China")

使用这些值(“Canada”,“us”,...),我完成了一个循环,通过将每个值粘贴到“https://en.wikipedia.org/wiki/”来创建一个 URL,之后,每个新的 html 应用 read_html (i) 和一系列代码最终用 html_nodes ('a.page-link') 捕获一个节点 - 是的!一个节点,而不是文本,并将 html_nodes (...) 作为.character 保存在 data.frame 中(或者可以是列表)。

dff<- NULL
for ( i in country ) {
url<-paste0("https://en.wikipedia.org/wiki/",i)
page<- read_html(url) 
b <- page%>%
html_nodes ('h2.flow-title') %>%
html_nodes ('a.page-link') %>%
as.character()
dff<- data.frame(b)
}

问题是这段代码只保存了上一个国家的数据,即运行第一个国家并获取html_nodes(保存它),但是当运行下一个国家时,第一个数据被删除并替换为这个新的,依此类推,最终结果只是来自最后一个国家的数据。 我会很感激你的帮助!

【问题讨论】:

  • 您只能获得最后一个值,因为您的 b 值在每次迭代中不断被覆盖,而 dff&lt;- data.frame(b) 实际上并未将 b 附加到数据帧中。你对输出有什么期望?从您的代码看来,您似乎从每次迭代中获得了一个字符串,为什么不将字符向量作为最终输出?

标签: html r loops nodes rvest


【解决方案1】:

正如评论中提到的这一行:dff&lt;- data.frame(b) 在每次循环迭代中都写完了 dff。解决方案是创建一个空列表并将数据附加到列表中。
在此示例中,列表项以所查询的国家/地区命名。

library(rvest)
country <- c("Canada", "US", "Japan", "China")

#initialize the empty list
dff<- list()

for ( i in country ) {
  url<-paste0("https://en.wikipedia.org/wiki/",i)
  page<- read_html(url) 
  b <- page%>%
    html_nodes ('h2.flow-title') %>%
    html_nodes ('a.page-link') %>%
    as.character()
#append new data onto the list
  dff[[i]]<- data.frame(b)
}

要访问数据,可以使用 dff$Canada 或 lapply 来处理整个列表。

注意:我运行了您的示例,但没有返回任何结果,最好仔细检查节点 ID。

【讨论】:

  • 在 R 中,不应创建空列表并将其附加新元素。这将导致刮板使用更多的内存,因此它会很慢。如果country 非常大,这可能需要很长时间才能运行。相反,总是声明一个大小为 N 的列表,其中每个元素 n 为空。所以请改用dff &lt;- vector(mode = "list", length = length(country))。其他一切都可以保持不变。请参阅 The R Infernochapt 2 了解更多关于生长物体的罪恶。
猜你喜欢
  • 1970-01-01
  • 2022-01-17
  • 2020-12-07
  • 2013-03-01
  • 1970-01-01
  • 2021-01-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多