Kirjautuminen

Haku

Tehtävät

Kilpailu

Algoritmikisa
Putka Open 2020 -kisan
4. kierros: 6.–8.11.

Keskustelu: Ohjelmointiongelmat: Pythonilla sivun validointi

Sivu 1 / 1

Sivun loppuun

Jaska [04.09.2020 16:49:14]

Lainaa #

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?

Grez [04.09.2020 17:04:06]

Lainaa #

Kyllä pystyy.

Käytännössä millä tahansa ohjelmointikielellä pystyy.

Jaska [04.09.2020 21:13:42]

Lainaa #

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ää?

Metabolix [04.09.2020 21:27:18]

Lainaa #

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.

Jaska [04.09.2020 21:44:03]

Lainaa #

Ä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      >&#x2709;</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      >&#x2709;</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      >&#x2709;</a>\n    </p>\n",

              "type": "info"
          }

        ],
    "source": {
        "encoding": "utf-8",
        "type": "text/html"
    }
}

Metabolix [04.09.2020 21:58:56]

Lainaa #

Sinulta on nyt jotain kadonnut tuosta välistä, koska tuo ei ole edes validia JSON-dataa:

"message": ,

Jaska [04.09.2020 22:04:21]

Lainaa #

Tuollaisen ilmoituksen sain curlilla. Sama rivi on myös näytölläni.

Metabolix [04.09.2020 22:29:31]

Lainaa #

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"

jalski [19.09.2020 02:05:02]

Lainaa #

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>

Sivun alkuun

Vastaus

Muista lukea kirjoitusohjeet.
Tietoa sivustosta