如何在维基数据上抓取 'In more languages' table?

How to scrape 'In more languages' table on Wikidata?

我正在尝试抓取维基数据页面上的整个 'In more languages' table,例如https://www.wikidata.org/wiki/Q3044

我在 R 中尝试了 2 种方法:

library(rvest)
url <- "https://www.wikidata.org/wiki/Q3044"
pg <- url %>% read_html

pg <- pg %>% 
  html_nodes(".wikibase-entitytermsforlanguagelistview") %>%
  html_table()

table <- pg[[1]]

但这return只有英文部分(1行)。

我也试过:

library(tidywikidatar)
tw_get_label(id = c("Q3044"),language = "nl")

但这return只有一个标签。但是,我想要维基数据上的所有 'Also known as' 类别。

如有任何帮助,我们将不胜感激!

多么好的问题。您只获得了 table 的第一行,因为那是页面最初加载的所有内容,并且后台发生了一些 JavaScript 魔术,以便在之后加载 table 的其余部分页面加载。如果您重新加载页面并仔细观察,您可以看到这种情况发生 - 我在下面包含了一个 gif 来展示这一点。由于 R 没有 运行 所有额外的魔法,它得到的只是原始页面。

然而,所有这些都意味着我们需要寻找一个不同的 URL 来采购完整的 table。使用 Chrome 的开发人员工具,我们了解到 table 来自 https://www.wikidata.org/wiki/Special:EntityData/Q3044.json,这就是我们真正想要抓取的页面。如果我们使用 jsonLite 下载它,我们不会准确地获得 table,但我们可以使用一些 dplyr 工具重新组装它。这是执行此操作的代码片段:


wiki_data <- jsonlite::read_json("https://www.wikidata.org/wiki/Special:EntityData/Q3044.json")
table_data <- wiki_data$entities$Q3044

library(dplyr)
label_col <- bind_rows(table_data$labels) %>% rename(label=value)
desc_col <- bind_rows(table_data$descriptions) %>% rename(description=value)
alias_col <- bind_rows(table_data$aliases) %>% 
  rename(alias=value) %>%
  group_by(language) %>%
  summarise(alias=paste(alias, collapse = ", "))

full_table <- label_col %>%
  left_join(desc_col) %>%
  left_join(alias_col)

输出的前几行如下所示:

> full_table
# A tibble: 157 x 4
   language label                         description                                        alias
   <chr>    <chr>                         <chr>                                              <chr>
 1 fr       Charlemagne                   empereur d'Occident et roi des Francs              Char~
 2 en       Charlemagne                   King of the Franks, King of Italy, and Holy Roman~ Karo~
 3 it       Carlo Magno                   re dei Franchi e dei Longobardi e primo imperator~ NA   
 4 ilo      Karlomagno                    Ari dagiti Pranko ken Lombardo ken Emperador ti N~ NA