我想创建一个能够读取CSS和XPATH参数的html_node包装器。我想创建一个可以提供给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后面的内容。
最好的,莫里茨
通常,!!
运算符仅适用于支持quasiquoation的函数。不幸的是,rvest::html_nodes
目前没有。 (但由于它是tidyverse的一部分,如果以后添加支持,我不会感到惊讶。)
有几种方法可以以编程方式为函数调用提供参数,包括来自基数R的do.call()
。但是,鉴于您使用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()
}