如何在通用函数中的html_nodes中包装css和xpath参数

时间:2019-03-23 19:31:31

标签: r xpath web-scraping rlang

我想围绕html_node创建一个包装器,该包装器能够读取CSS和XPATH参数。我想创建一个可以提供给html_node并在现场进行评估的带引号的表达式。我想出了如何分别为css和xpath创建path参数,但是当我将此表达式提供给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后面的内容。

最好, 莫里茨

1 个答案:

答案 0 :(得分:0)

通常,!!运算符仅在支持quasiquoation的函数中起作用。不幸的是,rvest::html_nodes当前没有。 (但是由于它是tidyverse的一部分,如果以后再添加支持,我不会感到惊讶。)

有几种方法可以以编程方式为函数调用提供参数,包括来自基数R的do.call()。但是,鉴于您使用map遍历页面,建议您预先设置{ csspurrr::partial()的{1}}或xpath自变量:

html_nodes