【问题标题】:replace a url (or a string containing multiple urls) with a value returned from a function用函数返回的值替换 url(或包含多个 url 的字符串)
【发布时间】:2020-05-19 02:17:25
【问题描述】:

我们有一个像这样的df

df <- data.frame(id= c(1,2,3,4,5),
                 urls= c(NA,NA,"https://www.bing.com",
                         "https://www.bing.com https://www.google.com",
                         "https://github.com/"),
                 stringsAsFactors = FALSE)

然后我们有一个读取真实url的函数,并获取每个页面的title标签。就这样-

get_title_tag <- function(url) {

  if (is.na(ifelse(url == "", NA, url))) {
    return(NA)
  }
  else if(identical(xml2::read_html(url), character(0))){
    return(NA)
  }
  else{
    page <- xml2::read_html(url)

    path_to_title <- "/html/head/title"

    conf_nodes <- rvest::html_nodes(page, xpath = path_to_title)

    title <- rvest::html_text(conf_nodes)

    #return(title)
   return ("PAGE_TITLE")
  }
}

问题是urls列第4位的元素包含两个连续的url,所以我们得到错误。我们在论坛中查看了几篇帖子,但没有一个像我们面临的问题。

我们的目标是得到这个输出:

> df
  id                                          urls
1  1                                          <NA>
2  2                                          <NA>
3  3                                         PAGE_TITLE
4  4                              PAGE_TITLE PAGE_TITLE
5  5                                         PAGE_TITLE

我已经尝试过这种分离网址的方法,但扩展了我不想要的 df:

urls_only_vector <- df %>%
                      mutate(urls= strsplit(as.character(urls), " ")) %>%
                      unnest(urls) #%>% select("urls")

使用这种方法我可以一次读取一个网址,但由于它扩展了我的数据框,我想知道是否还有其他事情可以做?我可以得到提示吗?我会珍惜任何帮助。

【问题讨论】:

    标签: r url data-manipulation data-cleaning


    【解决方案1】:

    最好在不同的行中获取url,应用get_title_tag函数获取标题并再次组合数据,按id分组,使数据大小保持不变。

    library(dplyr)
    
    df %>%
      tidyr::separate_rows(urls, sep = '\\s+') %>%
      mutate(title = purrr::map_chr(urls, get_title_tag)) %>%
      group_by(id) %>%
      summarise(title = toString(title))
    

    【讨论】:

    • Ronak 你前世是我的祖父吗?你总是给我指路哈哈。伙计,我为什么没想到group_by(id)。优秀的思维!谢谢一百万先生:)
    猜你喜欢
    • 1970-01-01
    • 2015-11-22
    • 1970-01-01
    • 1970-01-01
    • 2021-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-04
    相关资源
    最近更新 更多