【问题标题】:Within a function, return NA or 0 if xpath is not to found在函数内,如果找不到 xpath,则返回 NA 或 0
【发布时间】:2021-06-05 18:32:08
【问题描述】:

在函数中,我需要为在 thapge 上不是 (!) 的 xpath 项返回“NA”或更好的“0”。在大多数页面上,我从列表中刮取 xpath 项存在,但在某些页面上不存在。如果不存在,则返回向量变得不对称,不能进一步合并。

return_data <- function(url) {
  page <- url %>% read_html 
  tibble(YealyRevenue = page %>%
           html_nodes(xpath = '//div[contains(h4, "YealyRevenue")]') %>%
           html_text(trim = TRUE) %>%
           parse_number(), 
         Cashflow = page %>% 
           html_nodes(xpath = '//div[contains(h4, "Cashflow:")]') %>% 
           html_text(trim = TRUE) %>% 
           parse_number(), 
         Spendings =  page %>% 
           html_nodes(xpath = '//*[@id="Spendings"]/a' ) %>% 
           html_text(trim = TRUE) %>% 
           parse_number(), 
         Return = page %>% 
           html_nodes(xpath = '//*[@id="Return"]/div[1]/div[2]/div/div[2]/div[2]/h1') %>%
           html_text(trim = TRUE))
}

最后一项是我抓取的所有页面上并不总是存在的一项。

Return = page %>% 
           html_nodes(xpath = '//*[@id="Return"]/div[1]/div[2]/div/div[2]/div[2]/h1') %>%
           html_text(trim = TRUE)

为此,我需要类似的东西

"如果没有找到这个xpath,请返回"0"

感谢任何线索!

【问题讨论】:

  • 你可以用tryCatch 包裹来做这个
  • 我不熟悉 tryCatch。你能解释一下吗?
  • 在没有 xpath 时是否出现任何错误,或者它是否静默返回。 tryCatch 通过捕获该错误来工作,然后我们为这些情况返回一个自定义值
  • 是的,我的整个脚本停止了,因为函数中的数据通常被收集并与 cbind 合并到一个组合向量中。如果相应的 xpath 不在页面上,则向量具有不同的长度,因此无法组合。这就是为什么我需要一个“NA”或“0”返回以在所有 4 个刮掉的项目中具有相同的长度。
  • 您可以尝试下面发布的解决方案。我还没有测试过,但我认为它可以工作

标签: r web-scraping xpath dplyr rvest


【解决方案1】:

我们可以用tryCatch 包裹链,并在有error 时指定return 值。如果有warning,也可以添加更多return

return_data <- function(url) {
  page <- url %>% read_html 
  YealyRevenue <- page %>%
           html_nodes(xpath = '//div[contains(h4, "YealyRevenue")]') %>%
           html_text(trim = TRUE) %>%
           parse_number()
  Cashflow <- page %>% 
           html_nodes(xpath = '//div[contains(h4, "Cashflow:")]') %>% 
           html_text(trim = TRUE) %>% 
           parse_number()
  Spendings <- page %>% 
           html_nodes(xpath = '//*[@id="Spendings"]/a' ) %>% 
           html_text(trim = TRUE) %>% 
           parse_number()
   Return <- tryCatch({ 
         page %>% 
           html_nodes(xpath =
            '//*[@id="Return"]/div[1]/div[2]/div/div[2]/div[2]/h1') %>%
           html_text(trim = TRUE)},
            error = function(err) {
            message("xpath doesn't exist")
            return(NA)
            })

  return(tibble(YearlyRevenue, Cashflow, Spending, Return))            
           
}

【讨论】:

  • 没有直接错误。缺少的项目只是没有被刮掉,因此最终向量的长度不同。这会产生一个错误。它应该更像“ If xpath = "...Return..." is not found, 而不是 return NA"
  • @TomTe 您可以将tryCatch 包裹在第二部分周围,即“返回”,然后构造tibble
猜你喜欢
  • 2017-07-24
  • 2021-06-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-14
  • 2015-01-18
相关资源
最近更新 更多