首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >用R解析法国数字Gallica api

用R解析法国数字Gallica api
EN

Stack Overflow用户
提问于 2019-11-20 08:12:24
回答 1查看 46关注 0票数 1

盖丽卡是法国国家数字图书馆。我正在研究1916年出版的法国报纸“西部日报”。

Gallica有一个API,我可以通过以下网址获得1916年所有问题的所有ids (ark)和dayOfYear的列表:

代码语言:javascript
运行
复制
https://gallica.bnf.fr/services/Issues?ark=ark:/12148/cb41193663x/date&date=1916
# ark is the identifier of the newspaper

例子:

代码语言:javascript
运行
复制
    <issue ark="bpt6k567105k" dayOfYear="1">01 janvier 1916</issue>

我试图将输出解析为dataframe,而不使用XML包获得成功:

代码语言:javascript
运行
复制
library(XML)
data <- xmlParse("https://gallica.bnf.fr/services/Issues?ark=ark:/12148/cb41193663x/date&date=1916")

xml_data <- xmlToList(data)

R给出了这个错误:

代码语言:javascript
运行
复制
Error: XML content does not seem to be XML: 'https://gallica.bnf.fr/services/Issues?ark=ark:/12148/cb41193663x/date&date=1916'
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-11-20 09:10:39

XML看起来像:

代码语言:javascript
运行
复制
<issues compile_time="0:00:14.417" date="1916" list_type="issue" parent_ark="ark:/12148/cb41193663x/date">
    <issue ark="bpt6k567105k" dayOfYear="1">01 janvier 1916</issue>
    <issue ark="bpt6k567106z" dayOfYear="2">02 janvier 1916</issue>
    ...
</issues>

我们可以提取属性(arkdayOfYear)和内容(litteral ),方法是获取所有子元素(xml_find_all(".//issue"),然后将所有作为数据date (map_df)构建的元素组装为一行:

代码语言:javascript
运行
复制
library(httr)
library(xml2)
library(tidyverse)

r <- GET("https://gallica.bnf.fr/services/Issues?ark=ark:/12148/cb41193663x/date&date=1916")

r %>%
  content() %>% 
  xml_find_all(".//issue") %>% 
  map_df(~ c(as.list(xml_attrs(.x)), date_parution = xml_text(.x)))

结果:

代码语言:javascript
运行
复制
# A tibble: 366 x 3
   ark          dayOfYear date_parution  
   <chr>        <chr>     <chr>          
 1 bpt6k567105k 1         01 janvier 1916
 2 bpt6k567106z 2         02 janvier 1916
 3 bpt6k567107b 3         03 janvier 1916
 4 bpt6k567108q 4         04 janvier 1916
 5 bpt6k5671093 5         05 janvier 1916
 6 bpt6k5671101 6         06 janvier 1916
 7 bpt6k567111d 7         07 janvier 1916
 8 bpt6k567112s 8         08 janvier 1916
 9 bpt6k5671135 9         09 janvier 1916
10 bpt6k567114j 10        10 janvier 1916
# ... with 356 more rows

如果您有代理,请使用:

代码语言:javascript
运行
复制
GET("https://gallica.bnf.fr/services/Issues?ark=ark:/12148/cb41193663x/date&date=1916",
    use_proxy("your.proxy.address",
              port = 8080,
              username = "user",
              password = "password"))
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58949537

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档