Created
July 5, 2019 06:24
-
-
Save msaby/b82b658b1333705a5220c11d1cf7fdbb to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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