使用 rvest href 获取完整的 link
Getting the full link with rvest href
我正在尝试使用 rvest
抓取多个页面。但是,我通过html_attr("href")
得到的link是不完整的。不幸的是,link 的初始部分以我无法理解的方式跨页面更改。你知道有没有解决办法?谢谢。
这是网站的两个例子。跨页面变化的部分似乎是“/sk####”。 (我对 Relazione 和 Testo 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")
)
})
我正在尝试使用 rvest
抓取多个页面。但是,我通过html_attr("href")
得到的link是不完整的。不幸的是,link 的初始部分以我无法理解的方式跨页面更改。你知道有没有解决办法?谢谢。
这是网站的两个例子。跨页面变化的部分似乎是“/sk####”。 (我对 Relazione 和 Testo 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")
)
})