
Envoyé par
marco056
A adapter peut-être ?
sve@r est gentil!
Pour adapter, ça serait mieux que ce soit un peu moins brouillon.
Moi aussi j'ai tiqué sur la remarque # si le nombre de pages dépasse 2000, changer le nombre.
Déjà si on a 500 pages, c'est "gros"...
Du coup, on sort rarement de la boucle à cause de cette condition mais plutôt via ce que retourne la fonction isurl.
Si on s'y penche un peu:
1 2 3 4 5 6 7 8 9
| def isurl(url_test) :
try:
response = requests.get(url)
response.raise_for_status()
return True
except requests.exceptions.HTTPError as err:
if err.response.status_code == 404:
print("404 Error")
return False |
On passe une variable en paramètre pour utiliser une variable globale dans le corps de la fonction.
Après on a un soucis de logique: si on suppose que 404 signale que toutes les pages du bouquin ont été lues et que la fonction retournera False dans ce cas, on ignore les autres erreurs qui vont aussi retourner False (puisque c'est ce que retourne par défaut une fonction), erreurs qui pourraient être sujet à reprise.
Autre détail, puisqu'on ne teste que l'existence de l'URL, inutile de demander au serveur de nous retourner le contenu: ça évite de charge disque, serveur, réseau,... et ça demande juste de remplacer requests.get par requests.head.
Mais on ne va pas réécrire cette fonction puisqu'elle n'est là que pour suppléer à une utilisation "molle" de subprocess:
subprocess.run(['wkhtmltopdf', url, sortie], cwd=repertoire)
Car subprocess.run retourne une instance de CompletedProcess dans lequel l'attribut returncode va dire si l'opération s'est bien déroulée ou pas. on peut même demander a ce qu'une exception soit levée dans ce cas (check=True).
Et si l'URL n'existe pas, ça sortira en erreur...
Du coup, ça donne:
1 2 3 4 5 6 7 8 9 10 11
| from itertools import count
for num_pages in count(start=1):
url = url_manuel.format(num_page)
sortie = "page{}.pdf".format(num_page)
print(sortie)
s = subprocess.run(['wkhtmltopdf', url, sortie], cwd=repertoire, text=True, capture_output=True)
if s.returncode != 0:
if s.stderr.splitlines()[-1].split()[-1] == 'ContentNotFoundError':
print("404 Error")
break |
ce qui à priori est fonctionnellement équivalent (pas mieux pas moins bien) en 7-8 lignes au lieu de 20+.
- W
Partager