Как обернуть аргументы css и xpath в html_nodes в обобщенную функцию - PullRequest
0 голосов
/ 23 марта 2019

Я хочу создать оболочку вокруг html_node, способную читать аргументы CSS и XPATH. Я хочу создать выражение в кавычках, которое может быть передано в html_node и оценено на месте. Я выяснил, как создать аргумент пути для css и xpath соответственно, но когда я передаю это выражение в html_node, оно не работает. Почему нет?

page_parser <- function(dat_list, path = NULL, css = FALSE, attr = "") {
  library(rlang)
  # make css or path argument for html_nodes
  if (css == TRUE) {
    path <- expr(`=`(css, !!path))
  }else{
    path <- expr(`=`(xpath, !!path))
  }
  # extract attribute value
  map(dat_list, possibly(function(x) { html_nodes(x, !!path) %>% html_attr(attr) %>% extract(1)}, NA)) %>% 
     map(1) %>% 
     lapply(function(x) ifelse(is_null(x), "", x)) %>%
     unlist()
 }

read_html("https://www.freitag.de/autoren/lutz-herden/alexis-tsipras-fall-oder-praezedenzfall" %>% parge_parser(path = "//meta[@property='og:title']")

read_html("https://www.freitag.de/autoren/lutz-herden/alexis-tsipras-fall-oder-praezedenzfall" %>% parge_parser(path = ".title", css = TRUE)

Функция должна выплевывать содержимое за css или xpath, независимо от того, был ли я указан CSS или Xpath.

Лучший, Moritz

1 Ответ

1 голос
/ 24 марта 2019

В общем случае оператор !! работает только в тех функциях, которые поддерживают квазиквакация .К сожалению, rvest::html_nodes в настоящее время нет.(Но так как это часть tidyverse, я не удивлюсь, если поддержка будет добавлена ​​позднее.)

Существует несколько способов программно предоставить аргументы для вызова функции, включая do.call() из базыR. Однако, учитывая, что вы используете map для обхода своей страницы, я рекомендую предварительно установить аргумент css или xpath от html_nodes до purrr::partial():

page_parser <- function(dat_list, path = NULL, css = FALSE, attr = "") {
  # make css or xpath argument for html_nodes
  if (css == TRUE) {
    f_html_nodes <- purrr::partial( html_nodes, css = path )
  }else{
    f_html_nodes <- purrr::partial( html_nodes, xpath = path )
  }

  # extract attribute value
  map(dat_list, possibly(function(x) { f_html_nodes(x) %>% html_attr(attr) %>% 
                                         extract(1)}, NA)) %>% 
                  map(1) %>% lapply(function(x) ifelse(is_null(x), "", x)) %>%
    unlist()
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...