【问题标题】:Arguments imply differing number of rows when scraping a website在抓取网站时,参数意味着不同的行数
【发布时间】:2019-08-06 09:39:33
【问题描述】:

运行代码时出现此错误:

Error in data.frame(date = html_text(html_nodes(pagina, ".node-post-date")),  : 
  arguments imply differing number of rows: 9, 10

在页面 983 中抓取标签时,我只得到 9 个结果(而不是通常每页 10 个结果)。我认为这种情况正在发生,因为在该网页中,我要抓取的日期之一与我正在使用的日期具有不同的标签。

我对 R 很陌生,所以我不知道如何在我的代码中运行 if 语句来为我没有得到的结果获取 NA。

这是我的代码:

#Libraries
library(rvest)
library(purrr)
library(tidytext)
library(dplyr)

url_espectador <- 'https://www.elespectador.com/search/farc?page=%d&sort=created&order=desc'

map_df(980:990, function(i) {

  pagina <- read_html(sprintf(url_espectador, i, '%s', '%s', '%s', '%s'))
  print(i)

  data.frame(title = html_text(html_nodes(pagina, ".node-title a")),
             date = html_text(html_nodes(pagina, ".node-post-date")),
             link = paste0("https://www.elespectador.com", str_trim(html_attr(html_nodes(pagina, ".node-title a"), "href"))),
             stringsAsFactors=FALSE)
  }) -> noticias_espectador

除了 if 语句,还有其他解决方案吗?我要抓取大量页面,所以我需要避免这个行匹配问题。感谢您的帮助!

【问题讨论】:

  • 你可能想看一下R中的tryCatchfunction。关于错误,你可以使用它跳到下一步。
  • 你是对的,@QHarr。我已经编辑过了。谢谢!

标签: r web-scraping rvest


【解决方案1】:

您可以使用 css 或语法添加其他类(适用于少量附加类时)。

或者,您可以选择共享父节点,测试是否存在特定子节点,如果不存在则返回 NA。 This 答案向您展示了后一种方法。如果您使用后者,则可以使用选择器 .node--search-result 获得合适的父节点 - 您可能会错过实际感兴趣的子节点(如在本例中不同的类) - 但代码不会出错。

还有第三种选择——在观察到的情况下,这些类有一个共同的后缀,因此您可以使用attribute = value css 选择器,以及contains (*) 或ends with ($) 运算符,例如date = html_text(html_nodes(pagina, "[class$='post-date']"))

library(rvest)
library(purrr)
library(tidytext)
library(dplyr)

url_espectador <- 'https://www.elespectador.com/search/farc?page=%d&sort=created&order=desc'

map_df(980:990, function(i) {

  pagina <- read_html(sprintf(url_espectador, i, '%s', '%s', '%s', '%s'))
  print(i)

  data.frame(title = html_text(html_nodes(pagina, ".node-title a")),
             date = html_text(html_nodes(pagina, ".node-post-date, .field--name-post-date")),
             link = paste0("https://www.elespectador.com", str_trim(html_attr(html_nodes(pagina, ".node-title a"), "href"))),
             stringsAsFactors=FALSE)
}) -> noticias_espectador

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-11-26
    • 1970-01-01
    • 2013-09-03
    • 2014-12-01
    • 1970-01-01
    • 2014-06-18
    相关资源
    最近更新 更多