Web scraping 如何为未找到的xpath返回NA

Web scraping 如何为未找到的xpath返回NA,web-scraping,xpath,rvest,Web Scraping,Xpath,Rvest,我有一个功能刮类似的网站。其中一些站点不包含下面定义的xpath。然而,在缺少xpath的情况下,我需要返回“NA” page <- read_html("https://www.imdb.com/title/tt2620590/") Budget_raw = page %>% html_nodes(xpath = '//div[contains(h4, "Budget:")]') %>% replace((Bu

我有一个功能刮类似的网站。其中一些站点不包含下面定义的xpath。然而,在缺少xpath的情况下,我需要返回“NA”

page <- read_html("https://www.imdb.com/title/tt2620590/")

Budget_raw = page %>% 
           html_nodes(xpath = '//div[contains(h4, "Budget:")]') %>% replace((Budget_raw), NA) %>%
           html_text(trim = TRUE) %>% 
           parse_number()
page%
html_节点(xpath='//div[contains(h4,“Budget:”)]]%>%replace((Budget_-raw),NA)%>%
html_文本(trim=TRUE)%>%
解析_数()
在这种情况下,不知道如何使replace函数工作。 或者,如果其他解决方法能更好地工作

有什么建议吗?!
非常感谢

在完整代码中使用
html\u节点
而不是
html\u节点
,因为您只希望给定行中的每一列都有一个节点匹配<如果未找到匹配项,则代码>html_节点将返回N/A

我已经更新到尽可能快地使用css。另外,更改了你的一个XPath,使其返回相同的gross(World)而不是US | World(因为你混合和匹配的gross数字有不同的子div计数)

脚本
标记以及
列表名称
中更直接地提取
标题

整理一些命名

library(rvest)
library(tidyverse)
library(httr)
library(jsonlite)

return_data <- function(url) {
  page <- url %>% read_html()
  tibble(
    Gross_raw = page %>%
      html_node(xpath = '//div[contains(h4, "Cumulative Worldwide Gross:")]') %>% # otherwise you are picking up different gross e.g. US v World
      html_text(trim = TRUE) %>%
      parse_number(),
    Budget_raw = page %>%
      html_node(xpath = '//div[contains(h4, "Budget:")]') %>%
      html_text(trim = TRUE) %>%
      parse_number(),
    Year = page %>%
      html_node("#titleYear a") %>%
      html_text(trim = TRUE) %>%
      parse_number(),
    Title = page %>%
      html_node(".title_wrapper h1") %>%
      html_text(trim = TRUE)
  )
}
   
start_url <- "https://www.imdb.com/list/ls020643534/?sort=list_order,asc&st_dt=&mode=detail&page=1&title_type=movie&ref_=ttls_ref_typ"
page <- read_html(httr::GET(start_url, add_headers("Accept-Language" = "en-US")))

json <- page %>%
  html_node('[type="application/ld+json"]') %>%
  html_text() %>%
  jsonlite::fromJSON()

list_name <- gsub(
  " Series| series| Series in Order| Franchise| Collection| FRANCHISE| Films| - In Order| -in Order| Film series| Film Series|Series - | franchise| Movies| Ranked| movies| Series! \\ '| Film Series'", "",
  gsub(" \\(.*?)", "", json$name)
)

film_url <- map(json$about$itemListElement$url, url_absolute, start_url) %>% unlist()
film_name <- page %>%
  html_nodes(".lister-item-header a") %>%
  html_text()

dataset <- data.frame(film_name, film_url, stringsAsFactors = FALSE)
result <- cbind(dataset, map_df(dataset$film_url, return_data))
print(result)

你能提供足够的代码来重新编程吗?还有,这些建议没有帮助吗?对不起,我忘了URL。不,到目前为止,我还没能解决这个问题。你们有预算的url吗?我认为答案是使用html_节点,该节点将返回NA,其中不存在存在预算数据:page
page%>%html_节点(xpath='//div[contains(h4,“budget:”)]')%%>%html_文本(trim=TRUE)%%>%parse_number()
library(furrr)

no_cores <- future::availableCores() - 1
future::plan(future::multisession, workers = no_cores)
result <- cbind(dataset, future_map_dfr(film_url, .f = return_data))