首页 > 解决方案 > 使用 rvest 提取 url - 返回 {{article.Link}} 而不是链接?

问题描述

我正在尝试从网站“https://politi.dk/doegnrapporter”中抓取网址。我在 R 中使用 rvest 和 dplyr,但我的代码输出{{article.Link}}而不是实际链接。我认为这与加载链接网站的网站的 html 代码中的一些 Java 脚本有关,但是当我在 R 中抓取 url 时如何抵消这种情况。到目前为止,我的代码是:

library(rvest)

page <- read_html("https://politi.dk/doegnrapporter")
t <- page %>% html_nodes("a.newsResultLink") %>% html_attr('href')
t
[1] "{{article.Link}}"

因此,{{article.Link}}我想要的不是超链接的 URL 列表,例如“https://politi.dk/oestjyllands-politi/doegnrapporter/doegnrapport07092021/2021/09/07”、“https://politi.dk/nordsjaellands-politi /doegnrapporter/nordsjaellands-politi-uddrag-af-doegnrapport-0607-september-2021/2021/09/07”等。

标签: rweb-scrapingtidyverservest

解决方案


数据是从ng-init具有 class 的元素的属性中提取的newsList。这与ngInitAngular 中的指令相关联,当 JavaScript 在页面上运行时,数据会动态加载到您在网页上看到的位置。

您可以从该属性中提取内容,正则表达式输出适当的 JavaScript 对象以作为 json 处理,然后从中提取链接:

library(rvest)
library(stringr)
library(jsonlite)

page <- read_html('https://politi.dk/doegnrapporter')
m <- page |> html_element('.newsList') |> html_attr('ng-init') |> str_match(., 'init\\((.*)\\)')
data <- jsonlite::parse_json(m[2])
articles <- lapply(data$AllNews$NewsList, function(x) x$Link) |> unlist(recursive = F)

推荐阅读