如何在维基数据上抓取 '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
我正在尝试抓取维基数据页面上的整个 '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