Frage

Wie lässt sich am besten überprüfen, ob ein Dokument einer HTML-Version folgt (vorzugsweise einer, die ich angeben kann)?Ich würde gerne wissen, wo die Fehler auftreten, wie in einem webbasierten Validator, außer in einer nativen Python-App.

War es hilfreich?

Lösung

XHTML ist einfach zu verwenden lxml.

HTML ist schwieriger, da das Interesse an der Validierung in der HTML-Community traditionell nicht so groß ist (führen Sie StackOverflow selbst über einen Validator aus, hach).Die einfachste Lösung wäre die Ausführung externer Anwendungen wie z nsgmls oder OpenJade, und analysieren Sie dann ihre Ausgabe.

Andere Tipps

PyTidyLib ist eine schöne Python-Bindung für HTML Tidy.Ihr Beispiel:

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

Darüber hinaus ist es mit beiden kompatibel altes HTML Tidy und das neues Tidy-HTML5.

Ich denke, die eleganteste Möglichkeit ist es, den W3C Validation Service aufzurufen

http://validator.w3.org/

programmatisch.Nur wenige Menschen wissen, dass Sie kein Screenscraping der Ergebnisse durchführen müssen, um die Ergebnisse zu erhalten, da der Dienst nicht standardmäßige HTTP-Header-Parameter zurückgibt

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

zur Angabe der Gültigkeit und der Anzahl der Fehler und Warnungen.

Zum Beispiel die Befehlszeile

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

kehrt zurück

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

So können Sie den W3C Validation Service elegant aufrufen und die Ergebnisse aus dem HTTP-Header extrahieren:

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

Sie können sich dafür entscheiden, den HTML-Validator lokal zu installieren und einen Client zu erstellen, um die Validierung anzufordern.

Hier hatte ich ein Programm erstellt, um eine Liste von URLs in einer TXT-Datei zu validieren.Ich habe nur den HEAD überprüft, um den Validierungsstatus zu erhalten, aber wenn Sie ein GET ausführen, erhalten Sie die vollständigen Ergebnisse.Schauen Sie sich die API des Validators an, es gibt viele Optionen dafür.

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

Versuchen Sie Tidylib.Als Teil des Elementtidy-Moduls (erstellt Elementbäume aus HTML-Dokumenten) können Sie einige wirklich grundlegende Bindungen erhalten. 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

Das Parsen des Protokolls sollte Ihnen so ziemlich alles liefern, was Sie brauchen.

ich denke, dass HTML aufgeräumt werde tun, was du willst.Dafür gibt es eine Python-Bindung.

In meinem Fall funktionierten die Python W3C/HTML-Validierungspakete nicht pip search w3c (Stand September 2016).

Ich habe das mit gelöst

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

Weitere Dokumentation hier Python-Anfragen, W3C-Validator-API

Dies ist ein sehr einfacher HTML-Validator, der auf dem HTMLParser von lxml basiert.Es ist keine Internetverbindung erforderlich.

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

Beachten Sie, dass dabei nicht nach schließenden Tags gesucht wird. Daher wird beispielsweise Folgendes übergeben:

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

Folgendes ist jedoch nicht der Fall:

validate_html("<a href='example.com'>foo</a")
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top