Webscrape - R - 从复杂页面中提取

Webscrape - R - Extract from complex page

我需要从此页面中提取 80 个城市的值:

https://deutschland-studie-senioren-familie.zdf.de/senioren/

不幸的是,URL 不包含城市名称,而是具有如下结尾:“district/05754.

如果它有名字,我会使用:

ds= list ("Munich","Cologne", "further cities...")

for (city in ds){
  page = paste0("https://deutschland-studie-senioren-familie.zdf.de/senioren/" 

...}

在那种情况下你会怎么做?您可以在此页面上输入 city/postal 代码 - https://deutschland-studie-senioren-familie.zdf.de/senioren/ - 但我不知道如何编码,所以它会在 for 循环中自动执行。

此外,我想提取“Sicherheit und Infrastruktur”下每个城市的变量“Verkehrssicherheit”的排名。我用 Selectorgadget 尝试过,但它有问题。有什么提示吗?

非常感谢您。

可以从 svg 文件中提取名称和代码。然后,您可以构建一个映射 table 来帮助您使用名称中的 ID:

library(rvest)
library(tidyverse)
 
lookup <- read_html("https://deutschland-studie-senioren-familie.zdf.de/assets/data/senioren/dmap.svg") %>%
  html_nodes("#kreise path") %>%
  map_df(., function(x) {
    data.frame(
      place = x %>% html_attr("data-name"),
      id = x %>% html_attr("id")
    )
  })

urls <- paste0('https://deutschland-studie-senioren-familie.zdf.de/senioren/', lookup$id)

但是,您可以获得名称、等级等 json,如下所示:

library(jsonlite)

data <- jsonlite::read_json('https://deutschland-studie-senioren-familie.zdf.de/assets/data/senioren/districts.json')

您可以操纵 json 数据,例如按位置升序排列:

library(jsonlite)
library(tidyverse)

data <- jsonlite::read_json('https://deutschland-studie-senioren-familie.zdf.de/assets/data/senioren/districts.json')$districts

df <- map_df(data, function(x) {
  data.frame(
    name = x %>% {.$name},
    rank = x %>% {.$overall$rank}
  )
})

df <- df[order(df$rank),]