Pystyykö Pythonilla validoimaan html- tai css-tiedoston siten, että se ottaisi kovalevyltä tiedoston, laittaisi sen sivulle https://validator.w3.org/#validate_by_upload, painaisi Check ja tallentaisi virheet ja varoitukset johonkin muuttujaan Pythonissa?
Kyllä pystyy.
Käytännössä millä tahansa ohjelmointikielellä pystyy.
Hmm. Mitenkähän tuo tehdään? Kokeilin tehdä validin sivun, jonka validiuden varmistin lataamalla sen sivulle https://validator.w3.org/nu/#file . Kuitenkin bashissä komento
curl http://validator.w3.org/check -i -F output=json -F uploaded_file=@index.html
palautti (vain osa tulosteesta)
Content-Type: application/json; charset=UTF-8 X-W3C-Validator-Recursion: 1 X-W3C-Validator-Status: Valid X-W3C-Validator-Errors: 0 X-W3C-Validator-Warnings: 1
Ajattelin siis Pythonilla kutsua bash-skriptiä. Mitenkä siis sivun validius luetaan koneellisesti, kun validaattorin käyttö manuaalisesti ei näytä virhettä mutta curlin kautta näyttää?
Eihän tuo näytä mitään virhettä. ”Errors: 0”. Ja jos virheitä tuleekin, niin varmasti asia selviää, kun katsot sitä JSON-dataa, joka validaattorilta tulee. Siinä on selvä luettelo ilmoituksista ja jokaisen ilmoituksen kohdalla tieto, onko kyseessä virhe vai varoitus vai muu. Eli sinun pitää Pythonissa purkaa JSON-data (json.loads) ja käydä silmukalla läpi siinä olevat ilmoitukset.
Äh. Totta. Mutta saman tiedoston validointi netin kautta näyttää "No errors or warnings to show." ja bashin puolelta warnings: 1. Jotenkin en hahmota, mistä tuo varoitus tulee. Koko tulostus on bashin puolelta
HTTP/1.1 307 Temporary Redirect date: Fri, 04 Sep 2020 18:39:54 GMT server: Apache/2.4.38 (Debian) location: https://validator.w3.org/nu/#file transfer-encoding: chunked Status: 302 Found Location: https://validator.w3.org/nu/?doc=index.html&out=json Content-Type: application/json; charset=UTF-8 X-W3C-Validator-Recursion: 1 X-W3C-Validator-Status: Valid X-W3C-Validator-Errors: 0 X-W3C-Validator-Warnings: 1 { "url": "index.html", "messages": [ { "message": , "messageid": "html5", "explanation": " <p class=\"helpwanted\">\n <a\n href=\"feedback.html?uri=;errmsg_id=html5#errormsg\"\n\ttitle=\"Suggest improvements on this error message through our feedback channels\" \n >✉</a>\n </p>\n", "type": "info" }, { "message": , "messageid": "html5", "explanation": " <p class=\"helpwanted\">\n <a\n href=\"feedback.html?uri=;errmsg_id=html5#errormsg\"\n\ttitle=\"Suggest improvements on this error message through our feedback channels\" \n >✉</a>\n </p>\n", "type": "info" }, { "message": , "messageid": "html5", "explanation": " <p class=\"helpwanted\">\n <a\n href=\"feedback.html?uri=;errmsg_id=html5#errormsg\"\n\ttitle=\"Suggest improvements on this error message through our feedback channels\" \n >✉</a>\n </p>\n", "type": "info" } ], "source": { "encoding": "utf-8", "type": "text/html" } }
Sinulta on nyt jotain kadonnut tuosta välistä, koska tuo ei ole edes validia JSON-dataa:
"message": ,
Tuollaisen ilmoituksen sain curlilla. Sama rivi on myös näytölläni.
Olet oikeassa, käyttämäsi pyyntö palauttaa tuolla tavalla viallista dataa. Ohjeiden mukaan pyyntö kuuluukin tehdä aivan toisella tavalla:
curl -s -H "Content-Type: text/html; charset=utf-8" --data-binary @index.html "https://validator.w3.org/nu/?out=json"
Jaska kirjoitti:
Ajattelin siis Pythonilla kutsua bash-skriptiä.
Mikset vaan suoraan hoitaisi hommaa Pythonilla tai jos haluat bash-skriptiä käyttää, niin miksi turhaan kutsua Pythonin kautta?
Tämä tehtävä vie vain muutaman rivin koodia useimmilla ohjelmointikielillä. Kokeilin piruuttani toteuttaa tämän 8th ohjelmontikielellä:
needs net/http "https://validator.w3.org/nu/?out=json" constant URL { Content-Type: "text/html; charset=UTF-8" } constant HEADERS { url: @URL, headers: @HEADERS } constant REQUEST : app:main REQUEST 0 args "Expected html file to validate!" thrownull dup f:slurp swap "Can't find %s." s:strfmt thrownull "data" m:_! net:post if nip json> "messages" m:@ nip a:len not if drop "No error messages found!\n" . else ( "message" m:@ nip "- %s\n" s:strfmt . ) a:each! drop then else "err" m:@ nip "Error: %s\n" s:strfmt . then bye ;
Ohjelma ottaa tarkastettavan tiedoston argumenttina ja tulostaa yksinkertaisen listan virheistä:
C:\temp>8th p.8th page.html - Start tag seen without seeing a doctype first. Expected “<!DOCTYPE html>”. - Consider adding a “lang” attribute to the “html” start tag to declare the language of this document. C:\temp>
Tai sitten vaikka ohjelmointiputkan tapauksessa:
C:\temp>8th p.8th Ohjelmointiputka.html No error messages found! C:\temp>
Aihe on jo aika vanha, joten et voi enää vastata siihen.