Validere (X) HTML i Python

stemmer
30

Hva er den beste måten å gå om å validere at et dokument følger noen versjon av HTML (prefereably at jeg kan spesifisere)? Jeg vil gjerne være i stand til å vite hvor feil oppstår, som i en web-basert validator, bortsett fra i en innfødt Python app.

Publisert på 30/08/2008 klokken 01:15
kilden bruker
På andre språk...                            


8 svar

stemmer
22

PyTidyLib er en fin python bindende for HTML Tidy. Deres eksempel:

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

Videre den er kompatibel med både arv HTML Tidy og nye ryddig HTML5 .

Svarte 14/08/2009 kl. 18:04
kilden bruker

stemmer
15

Jeg tror den mest elegante måten å påberope seg W3C validering Service på

http://validator.w3.org/

programmatisk. De færreste vet at du ikke trenger å skjerm-skrape resultatene for å få de resultatene, fordi tjenesten returnerer ikke-standard HTTP header paramaters

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

for indikering av gyldigheten og antallet feil oppstår.

For eksempel, kommandolinjen

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

avkastning

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

Dermed kan du elegant påberope W3C validering service og trekke resultatene fra HTTP header:

# 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)
Svarte 09/05/2012 kl. 15:53
kilden bruker

stemmer
11

Du kan velge å installere HTML-validator lokalt og skape en klient til å be om validering.

Her hadde jeg laget et program for å validere en liste over nettadresser i en txt-fil. Jeg var bare sjekke hodet for å få validering status, men hvis du gjør en GET du vil få alle resultatene. Se på API av validatoren, er det nok av muligheter for det.

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
Svarte 14/03/2009 kl. 22:42
kilden bruker

stemmer
8

XHTML er enkelt, bruke LXML .

HTML er vanskeligere, siden det er tradisjonelt ikke vært så mye interesse i validering mellom HTML publikum (kjøre Stackoverflow seg selv gjennom en validator, yikes). Den enkleste løsning vil være å utføre eksterne applikasjoner som nsgmls eller OpenJade , og deretter analysere deres utgang.

Svarte 30/08/2008 kl. 01:20
kilden bruker

stemmer
5

Prøv tidylib. Du kan få noen virkelig grunnleggende bindinger som en del av elementtidy modul (bygger elementtrees fra HTML-dokumenter). 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

Parsing loggen skal gi deg stort sett alt du trenger.

Svarte 30/08/2008 kl. 01:55
kilden bruker

stemmer
2

Jeg tror at HTML ryddig vil gjøre hva du vil. Det er en Python bindende for det.

Svarte 30/08/2008 kl. 01:48
kilden bruker

stemmer
0

I mitt tilfelle python W3C / HTML validerings pakker ikke fungerte pip search w3c(per september 2016).

Jeg løste dette med

$ 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, ...

Mer dokumentasjon her python forespørsler , W3C Validator API

Svarte 05/09/2016 kl. 19:30
kilden bruker

stemmer
-1

Dette er en svært grunnleggende html validator basert på LXML er HTMLParser. Det krever ingen internettforbindelse.

_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)

Merk at dette ikke vil se etter lukking koder, så for eksempel, vil følgende pass:

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

Men følgende wont:

validate_html("<a href='example.com'>foo</a")
Svarte 24/10/2016 kl. 23:11
kilden bruker

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more