使用 rvest href 获取完整的 link

Getting the full link with rvest href

我正在尝试使用 rvest 抓取多个页面。但是,我通过html_attr("href")得到的link是不完整的。不幸的是,link 的初始部分以我无法理解的方式跨页面更改。你知道有没有解决办法?谢谢。

这是网站的两个例子。跨页面变化的部分似乎是“/sk####”。 (我对 RelazioneTesto articoli 页面的 link 感兴趣。

http://leg14.camera.it/_dati/leg14/lavori/stampati/sk5000/frontesp/4543.htm

http://leg14.camera.it/_dati/leg14/lavori/stampati/sk4500/frontesp/4477.htm


df <- structure(list(date = c(20010618L, 20010618L, 20010618L, 20010618L, 
                        20010618L), link = c("http://leg14.camera.it/_dati/leg14/lavori/schedela/trovastampatopdl.asp?pdl=814", 
                                                  "http://leg14.camera.it/_dati/leg14/lavori/schedela/trovastampatopdl.asp?pdl=858", 
                                                  "http://leg14.camera.it/_dati/leg14/lavori/schedela/trovastampatopdl.asp?pdl=875", 
                                                  "http://leg14.camera.it/_dati/leg14/lavori/schedela/trovastampatopdl.asp?pdl=802", 
                                                  "http://leg14.camera.it/_dati/leg14/lavori/schedela/trovastampatopdl.asp?pdl=816"
                        )), row.names = c(NA, 5L), class = "data.frame")


df$linkfinal<- pbsapply(df$link, function(x) {
  tryCatch({
    x %>%
      read_html() %>%
      html_nodes('td+ td a') %>%
      html_attr("href") %>% 
      toString()
  }, error = function(e) NA)
})

您只需捕获重定向 url(使用 httr),然后用 articola 或 [=14= 交换字符串 frontesp ].如果您首先使用这些相同的子字符串来测试包含它的 href 是否存在,您可以利用 ifelse 进行上述 url 替换或 return NA.

如果处理大量行,有更快的方法来应用函数。在这里阅读后,我只是对这种方法感兴趣:https://blog.az.sg/posts/map-and-walk/.

library(tidyverse)
library(httr)

df <- structure(list(date = c(
  20010618L, 20010618L, 20010618L, 20010618L,
  20010618L
), link = c(
  "http://leg14.camera.it/_dati/leg14/lavori/schedela/trovastampatopdl.asp?pdl=814",
  "http://leg14.camera.it/_dati/leg14/lavori/schedela/trovastampatopdl.asp?pdl=858",
  "http://leg14.camera.it/_dati/leg14/lavori/schedela/trovastampatopdl.asp?pdl=875",
  "http://leg14.camera.it/_dati/leg14/lavori/schedela/trovastampatopdl.asp?pdl=802",
  "http://leg14.camera.it/_dati/leg14/lavori/schedela/trovastampatopdl.asp?pdl=816"
)), row.names = c(NA, 5L), class = "data.frame")


get_link <- function(url, page, url_sub_string) {
  link <- page %>%
    html_element(sprintf("[href*=%s]", url_sub_string)) %>%
    html_attr("href")
  link <- ifelse(is.na(link), link, gsub("frontesp", url_sub_string, url))
  return(link)
}

df <- df %>%
  pmap_dfr(function(...) {
    current <- tibble(...)
    r <- GET(current$link)
    page <- r %>% read_html()
    redirect_link <- r$url
    current %>%
      mutate(
        articola = get_link(redirect_link, page, "articola"),
        relazion = get_link(redirect_link, page, "relazion")
      )
  })