【问题标题】:Extract url's with rvest - returns {{article.Link}} instead of the link?使用 rvest 提取 url - 返回 {{article.Link}} 而不是链接?
【发布时间】:2021-09-07 15:05:52
【问题描述】:

我正在尝试从网站“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" 等

【问题讨论】:

  • 您要准确提取什么?
  • 来自css元素的url(即网站的超链接)。
  • 为了收集网站引用的所有文章的 url 列表。
  • 该网页使用 Angular javascript 库。 rvest 之类的包无法运行 javascript 代码。如果你需要抓取这样的页面,你需要使用像 RSelenium 这样的包来使用可以运行 javascript 来获取数据的网络浏览器,

标签: r web-scraping tidyverse rvest


【解决方案1】:

数据是从类newsList 的元素的ng-init 属性中提取的。这与 Angular 中的 ngInit 指令相关联,当 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)

【讨论】:

  • 感谢您的回答@QHarr。它进行了一些修改。 1) 我使用%&gt;% 而不是|&gt;html_element() 似乎不在我使用的 rvest 版本中,所以我将其替换为 html_node() 并且效果很好。非常感谢!
  • 欢迎。是的,你做出了正确的改变。对于 1) 请参阅 this 和 2) 请参阅 this。至少升级 rvest 有一些明显的优势。
猜你喜欢
  • 2015-02-02
  • 1970-01-01
  • 2016-05-16
  • 1970-01-01
  • 2018-11-19
  • 2017-10-11
  • 1970-01-01
  • 2018-11-03
  • 2019-01-19
相关资源
最近更新 更多