【问题标题】:Reading nodes from multiple html and storing result as a vector从多个 html 中读取节点并将结果存储为向量
【发布时间】:2018-05-18 10:18:35
【问题描述】:

我有一个本地保存的 html 文件的列表。我想从每个 html 中提取多个节点并将结果保存在向量中。之后,我想将它们组合在一个数据框中。现在,我有一段适用于 1 个节点的代码,它可以工作(见下文),但如果我将它应用于大约 20 个变量,它似乎相当长且效率低下。此外,保存到向量(XXX_name)的一些事情真的很奇怪,它从最后一次观察开始,然后继续第一次,第二次,......你有什么建议来简化代码/提高效率吗?

# Extracts name variable and stores in a vector 
XXX_name <- c()
for (i in 1:216) { 
  XXX_name <- c(XXX_name, name)
  mydata <- read_html(files[i], encoding = "latin-1") 
  reads_name <- html_nodes(mydata, 'h1') 
  name <- html_text(reads_name) 
  #print(i) 
  #print(name) 
}

非常感谢!

【问题讨论】:

    标签: r for-loop web-scraping


    【解决方案1】:

    您可以将工作原理放在一个函数中,然后使用 map 将该函数应用于您的每个变量

    首先,创建函数:

    read_names <- function(var, node) {
    
      mydata <- read_html(files[var], encoding = "latin-1") 
      reads_name <- html_nodes(mydata, node) 
      name <- html_text(reads_name) 
    }
    

    然后我们创建一个包含所有可能输入组合的 df 并将函数应用于该函数

    library(tidyverse)
    
    inputs <- crossing(var = 1:216, node = vector_of_nodes) 
    
    output <- map2(inputs$var, inputs$node, read_names)
    

    【讨论】:

    • :@Shinobi_Atobe:谢谢!我是否不必每次都更改函数,因为我想提取不同的节点?在这种情况下,节点是“h1”,但对于下一次提取,这必须更改为读取不同的节点。
    猜你喜欢
    • 1970-01-01
    • 2018-09-21
    • 1970-01-01
    • 1970-01-01
    • 2021-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-23
    相关资源
    最近更新 更多