Skip to content

Instantly share code, notes, and snippets.

@msaby
Created July 5, 2019 06:24
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save msaby/b82b658b1333705a5220c11d1cf7fdbb to your computer and use it in GitHub Desktop.
Save msaby/b82b658b1333705a5220c11d1cf7fdbb to your computer and use it in GitHub Desktop.
from lxml import etree
import requests
import unittest
def webserviceSudocMerged (*args : str) -> str:
# Documentation http://documentation.abes.fr/sudoc/manuels/administration/aidewebservices/#merged
# paramètres : 1 ou plusieurs ppn
# résultat : réponse en XML
# aucune vérification
"""Wrapper autour du webservice merged"""
# print (args)
base_url = "https://www.sudoc.fr/"
service_url = "services/merged/"
params = ",".join(args)
#print (base_url+service_url+params)
requete = requests.get(base_url+service_url+params)
codehttp = requete.status_code
# print (requete.content)
return requete.content
def getSudocMerged (*args : str,recursif=True) :
"""Renvoie une liste de réponses : ppn(s) cherché(s) -> ppn(s) trouvé(s) ou None"""
apidata = webserviceSudocMerged (*args)
root = etree.XML(apidata)
error = root.xpath("//error")
result = []
if len(error) > 0:
result = [[arg,None] for arg in args]
else:
queries = root.xpath("//query")
# list : [[ppn1 cherché (string), liste de ppn trouvés (list)], [[ppn2 cherché (string), liste de ppn trouvés (list)]]
result = [[query.xpath("./ppn/text()")[0],query.xpath("./result/ppn/text()")] for query in queries ]
for r in result:
if len(r[1]) == 1:
# 1 seul PPN trouvé
r [1] = r[1][0]
else:
# si pas récursif on renvoit la liste des ppn candidats telle quelle
if recursif:
# plusieurs PPN candidats, il faut les tester pour isoler le bon
test_candidats = getSudocMerged (*r[1],recursif=False)
liste_candidats = []
for candidat in test_candidats:
if candidat[1] == None:
liste_candidats.append(candidat[0])
if len (liste_candidats) == 1 :
r [1] = liste_candidats[0]
else:
# ça ne devrait pas se produire
r[1] = None
for arg in args:
if arg not in [r[0] for r in result]:
result.append ([arg, None])
return result
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment