2016-03-15 1 views
0

J'essaie de lire une série de pages Web avec CLISP, si elles existent, mais je ne comprends pas comment open-http fonctionne pour ignorer les pages Web non existantes. Je donne les résultats suivants:Exemple Open-http CLISP

(dolist (word '(a b c)) 
    (with-open-stream (stream (ext:open-http 
           (format nil 
             "https://en.wikipedia.org/wiki/~a.html" 
             word) 
           :if-does-not-exist nil)) 
    (when stream 
     (print word)))) 

Je veux simplement sauter une page Web si elle n'existe pas, mais CLISP semble se bloquer et renvoie une erreur « argument non valide ». Quelqu'un pourrait-il expliquer comment fonctionne l'argument: if-does-not-exists et/ou fournir des exemples d'utilisation de open-http. Merci!

+0

Je pense que vous allez avoir des problèmes avec d'autres choses dans le processus: presque tous les sites web utilisent HTTPS de nos jours, OPEN-HTTP de CLISP ne supporte pas HTTPS. Aussi, d'après ce que je peux voir, les articles de Wikipedia ne sont pas placés dans des fichiers * .html, et d'autres fichiers ont des chemins plus compliqués. – mobiuseng

+0

En relation: [Existe-t-il une API Wikipedia?] (Http://stackoverflow.com/q/627594/124319). Aussi, jetez un oeil à [Drakma] (http://weitz.de/drakma/) – coredump

+0

Merci pour les réponses à ce jour, mais s'il vous plaît se concentrer sur la question: comment empêchez-vous d'ouvrir-http de suspendre lorsque la page ne le fait pas existe, indépendamment de son URL. Un exemple suffirait. – Leo

Répondre

1

Il fonctionne pour moi:

(with-open-stream (stream (ext:open-http 
          "http://stackoverflow.com/questions/234242424242" 
          :if-does-not-exist nil)) 
(format t "~&Stream: ~A~%" stream)) 

Sortie:

;; connecting to "http://stackoverflow.com/questions/234242424242"...connected...HTTP/1.1 404 Not Found 
;; HTML source of Page not found 
Stream: NIL 
NIL 

Il y a un délai pour obtenir la connexion, mais cela fonctionne.

Si la page existe:

[7]> (with-open-stream (stream (ext:open-http 
           "http://stackoverflow.com/questions/36003343/clisp-open-http-example" 
           :if-does-not-exist nil)) 
     (format t "~&Stream: ~A~%" stream)) 
;; connecting to "http://stackoverflow.com/questions/36003343/clisp-open-http-example"...connected...HTTP/1.1 200 OK 
Stream: #<IO INPUT-BUFFERED SOCKET-STREAM CHARACTER stackoverflow.com:80> 
NIL 

Avec Wikipédia je ne pouvais pas le faire fonctionner depuis Wikipedia.org redirige vers HTTPS et EXT:OPEN-HTTP ne peut gérer HTTPS directement, ni il peut gérer réoriente:

ici si HTTPS est utilisé directement:

[10]> (with-open-stream (stream (ext:open-http 
           "https://en.wikipedia.org/wiki/Common_Lisp" 
           :if-does-not-exist nil)) 
     (format t "~&Stream: ~A~%" stream)) 

*** - OPEN-HTTP: "https://en.wikipedia.org/wiki/Common_Lisp" is not an HTTP URL 
The following restarts are available: 
ABORT   :R1  Abort main loop 
Break 1 [11]> :r1 

Si "https" est remplacé par "http", CLISP ne construit pas une bonne adresse:

[12]> (with-open-stream (stream (ext:open-http 
           "http://en.wikipedia.org/wiki/Common_Lisp" 
           :if-does-not-exist nil)) 
     (format t "~&Stream: ~A~%" stream)) 
;; connecting to "http://en.wikipedia.org/wiki/Common_Lisp"...connected...HTTP/1.1 301 TLS Redirect --> "https://en.wikipedia.org/wiki/Common_Lisp" 
;; connecting to "http://en.wikipedia.orghttps://en.wikipedia.org/wiki/Common_Lisp"... 
*** - PARSE-INTEGER: substring "" does not have integer syntax at position 0 
The following restarts are available: 
ABORT   :R1  Abort main loop 
Break 1 [13]>