Domanda

Qual è il modo migliore per verificare che un documento segua una versione di HTML (preferibilmente che posso specificare)?Mi piacerebbe essere in grado di sapere dove si verificano gli errori, come in un validatore basato sul Web, tranne che in un'app Python nativa.

È stato utile?

Soluzione

XHTML è facile da usare lxml.

L'HTML è più difficile, dal momento che tradizionalmente non c'è stato tanto interesse per la convalida tra il pubblico HTML (esegui StackOverflow stesso attraverso un validatore, accidenti).La soluzione più semplice sarebbe eseguire applicazioni esterne come nsgmls O OpenJade, e quindi analizzare il loro output.

Altri suggerimenti

PyTidyLib è un bel collegamento Python per HTML Tidy.Il loro esempio:

from tidylib import tidy_document
document, errors = tidy_document('''<p>f&otilde;o <img src="bar.jpg">''',
    options={'numeric-entities':1})
print document
print errors

Inoltre è compatibile con entrambi HTML legacy ordinato e il nuovo tidy-html5.

Penso che il modo più elegante per invocare il servizio di convalida W3C sia su

http://validator.w3.org/

a livello di programmazione.Poche persone sanno che non è necessario eseguire lo screen-scraping dei risultati per ottenere i risultati, perché il servizio restituisce parametri di intestazione HTTP non standard

X-W3C-Validator-Recursion: 1
X-W3C-Validator-Status: Invalid (or Valid)
X-W3C-Validator-Errors: 6
X-W3C-Validator-Warnings: 0

per indicare la validità e il numero di errori e avvisi.

Ad esempio, la riga di comando

curl -I "http://validator.w3.org/check?uri=http%3A%2F%2Fwww.stalsoft.com"

ritorna

HTTP/1.1 200 OK
Date: Wed, 09 May 2012 15:23:58 GMT
Server: Apache/2.2.9 (Debian) mod_python/3.3.1 Python/2.5.2
Content-Language: en
X-W3C-Validator-Recursion: 1
X-W3C-Validator-Status: Invalid
X-W3C-Validator-Errors: 6
X-W3C-Validator-Warnings: 0
Content-Type: text/html; charset=UTF-8
Vary: Accept-Encoding
Connection: close

Pertanto, puoi invocare elegantemente il servizio di convalida W3C ed estrarre i risultati dall'intestazione HTTP:

# Programmatic XHTML Validations in Python
# Martin Hepp and Alex Stolz
# mhepp@computer.org / alex.stolz@ebusiness-unibw.org

import urllib
import urllib2

URL = "http://validator.w3.org/check?uri=%s"
SITE_URL = "http://www.heppnetz.de"

# pattern for HEAD request taken from 
# http://stackoverflow.com/questions/4421170/python-head-request-with-urllib2

request = urllib2.Request(URL % urllib.quote(SITE_URL))
request.get_method = lambda : 'HEAD'
response = urllib2.urlopen(request)

valid = response.info().getheader('X-W3C-Validator-Status')
if valid == "Valid":
    valid = True
else:
    valid = False
errors = int(response.info().getheader('X-W3C-Validator-Errors'))
warnings = int(response.info().getheader('X-W3C-Validator-Warnings'))

print "Valid markup: %s (Errors: %i, Warnings: %i) " % (valid, errors, warnings)

Puoi decidere di installare localmente il validatore HTML e creare un client per richiedere la convalida.

Qui avevo creato un programma per convalidare un elenco di URL in un file txt.Stavo solo controllando HEAD per ottenere lo stato di convalida, ma se esegui un GET otterrai i risultati completi.Guarda l'API del validatore, ci sono molte opzioni a riguardo.

import httplib2
import time

h = httplib2.Http(".cache")

f = open("urllistfile.txt", "r")
urllist = f.readlines()
f.close()

for url in urllist:
   # wait 10 seconds before the next request - be nice with the validator
   time.sleep(10)
   resp= {}
   url = url.strip()
   urlrequest = "http://qa-dev.w3.org/wmvs/HEAD/check?doctype=HTML5&uri="+url
   try:
      resp, content = h.request(urlrequest, "HEAD")
      if resp['x-w3c-validator-status'] == "Abort":
         print url, "FAIL"
      else:
         print url, resp['x-w3c-validator-status'], resp['x-w3c-validator-errors'], resp['x-w3c-validator-warnings']
   except:
      pass

Prova tidylib.Puoi ottenere alcuni collegamenti davvero basilari come parte del modulo elementtidy (costruisce elementtree da documenti HTML). http://effbot.org/downloads/#elementtidy

>>> import _elementtidy
>>> xhtml, log = _elementtidy.fixup("<html></html>")
>>> print log
line 1 column 1 - Warning: missing <!DOCTYPE> declaration
line 1 column 7 - Warning: discarding unexpected </html>
line 1 column 14 - Warning: inserting missing 'title' element

L'analisi del registro dovrebbe darti praticamente tutto ciò di cui hai bisogno.

penso che HTML ordinato farà quello che vuoi.Esiste un collegamento Python per questo.

Nel mio caso i pacchetti di convalida Python W3C/HTML non hanno funzionato pip search w3c (a settembre 2016).

L'ho risolto con

$ pip install requests

$ python
Python 2.7.12 (default, Jun 29 2016, 12:46:54)
[GCC 4.2.1 Compatible Apple LLVM 6.0 (clang-600.0.57)] on darwin
Type "help", "copyright", "credits" or "license" for more information.

>>> r = requests.post('https://validator.w3.org/nu/', 
...                    data=file('index.html', 'rb').read(), 
...                    params={'out': 'json'}, 
...                    headers={'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.101 Safari/537.36', 
...                    'Content-Type': 'text/html; charset=UTF-8'})

>>> r.text
>>> u'{"messages":[{"type":"info", ...

>>> r.json()
>>> {u'messages': [{u'lastColumn': 59, ...

Più documentazione qui richieste Python, API di convalida W3C

Questo è un validatore html molto semplice basato sull'HTMLParser di lxml.Non richiede alcuna connessione Internet.

_html_parser = None
def validate_html(html):
    global _html_parser
    from lxml import etree
    from StringIO import StringIO
    if not _html_parser:
        _html_parser = etree.HTMLParser(recover = False)
    return etree.parse(StringIO(html), _html_parser)

Tieni presente che questo non controllerà i tag di chiusura, quindi ad esempio passerà quanto segue:

validate_html("<a href='example.com'>foo</a>")

Tuttavia, quanto segue non lo farà:

validate_html("<a href='example.com'>foo</a")
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top