Jaki jest najlepszy sposób sprawdzenia, czy dokument podąża za jakąś wersją HTML (najlepiej, gdy mogę to określić)? Chciałbym wiedzieć, gdzie występują awarie, tak jak w przeglądarce sieciowej, z wyjątkiem natywnej aplikacji Python.Sprawdzanie poprawności (X) HTML w Pythonie
Odpowiedz
XHTML jest łatwy, użyj lxml.
HTML jest trudniejszy, ponieważ tradycyjnie nie ma tak dużego zainteresowania sprawdzaniem poprawności wśród tłumu HTML (uruchamianie samego StackOverflow za pomocą walidatora, yikes). Najprostszym rozwiązaniem byłoby wykonanie zewnętrznych aplikacji, takich jak nsgmls lub OpenJade, a następnie przeanalizowanie ich wyników.
Uwaga: link LXML jest uszkodzony. Może skorzystasz z [tego] (http://lxml.de/)? –
Myślę, że HTML tidy zrobi to, co chcesz. Istnieje powiązanie z Pythonem.
Wypróbuj tidylib. Możesz uzyskać naprawdę proste powiązania w ramach modułu elementtidy (buduje elementy z dokumentów 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
Parsowanie dziennika powinno dać ci wszystko, czego potrzebujesz.
Możesz zdecydować się lokalnie zainstalować weryfikator HTML i utworzyć klienta, aby poprosić o sprawdzenie poprawności.
Tutaj zrobiłem program do sprawdzania poprawności listy adresów URL w pliku txt. Właśnie sprawdzałem HEAD, aby uzyskać status sprawdzania poprawności, ale jeśli wykonasz GET, uzyskasz pełne wyniki. Spójrz na API walidatora, istnieje wiele opcji dla niego.
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
Niestety, 'html5lib' [nie sprawdza poprawności] (http://stackoverflow.com/a/29992363/593047). –
PyTidyLib to ładne wiązanie python dla HTML Tidy. Ich przykład:
from tidylib import tidy_document
document, errors = tidy_document('''<p>fõo <img src="bar.jpg">''',
options={'numeric-entities':1})
print document
print errors
Ponadto jest kompatybilny zarówno z legacy HTML Tidy i new tidy-html5.
Pakiet w systemie Debian: python-tidylib – sumid
Myślę, że to najbardziej elegancki sposób, aby wywołać walidator W3C na
http://validator.w3.org/
programowo. Niewiele osób wie, że nie masz do ekranu zeskrobać wyników w celu uzyskania wyników, ponieważ usługa zwraca niestandardowy nagłówek HTTP paramaters
X-W3C-Validator-Recursion: 1
X-W3C-Validator-Status: Invalid (or Valid)
X-W3C-Validator-Errors: 6
X-W3C-Validator-Warnings: 0
wskazujące na ważność i liczbę błędów i ostrzeżeń.
Na przykład, linia poleceń
curl -I "http://validator.w3.org/check?uri=http%3A%2F%2Fwww.stalsoft.com"
powraca
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
sposób można elegancko wywołać walidator W3C i wyodrębnić wynika z nagłówka HTTP:
# Programmatic XHTML Validations in Python
# Martin Hepp and Alex Stolz
# [email protected]/[email protected]
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)
Istnieje również pełny interfejs API usług WWW do W3C Validator i powiązanie z nim w Pythonie: https://bitbucket.org/nmb10/py_w3c –
Ten adres URL zwraca obecnie 302, a nie 200. Nie działa teraz! – sreeraag
W moim przypadku pakiety sprawdzania poprawności Pythona W3C/HTML nie działały pip search w3c
(według stanu na wrzesień 2016).
I rozwiązać ten z
$ 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, ...
Więcej dokumentacji tutaj python requests, W3C Validator API
Jest to bardzo podstawowy walidator HTML na podstawie lxml za HTMLParser. Nie wymaga żadnego połączenia z Internetem.
_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)
Należy pamiętać, że to nie będzie sprawdzał zamykających znaczników, tak na przykład, następujące minie:
validate_html("<a href='example.com'>foo</a>")
Jednak po przyzwyczajenie:
validate_html("<a href='example.com'>foo</a")
- 1. Sprawdzanie poprawności sprawdzania poprawności Knockout sprawdzanie poprawności
- 2. Sprawdzanie poprawności JQuery: Sprawdzanie poprawności ukrytych pól
- 3. Sprawdzanie poprawności stronicowanych formularzy w Angular JS (1.x)
- 4. Sprawdzanie poprawności wszystkich plików ASPX, ASCX i HTML podczas budowania
- 5. Sprawdzanie poprawności sprawdzania poprawności natychmiast po załadowaniu
- 6. TinyMCE - całkowicie wyłączyć sprawdzanie poprawności
- 7. Sprawdzanie poprawności argumentów w Ruby?
- 8. unikalne sprawdzanie poprawności w DDD
- 9. Sprawdzanie poprawności json w php
- 10. Sprawdzanie poprawności @ Html.Textbox w MVC4
- 11. Wyłącz sprawdzanie poprawności w seeds.rb
- 12. Scalaz: sprawdzanie poprawności w zrozumieniu i rejestrowaniu
- 13. Sprawdzanie poprawności mojego formularza
- 14. sprawdzanie poprawności schematu XML
- 15. sprawdzanie poprawności FCKeditora
- 16. Sprawdzanie poprawności pliku WADL
- 17. Sprawdzanie poprawności hasła jQuery
- 18. Sprawdzanie poprawności modelu szkieletowego
- 19. Sprawdzanie poprawności hasła FOSUserBundle
- 20. Sprawdzanie poprawności ukrytego pola
- 21. Sprawdzanie poprawności okna dialogowego
- 22. Sprawdzanie poprawności liczb dziesiętnych
- 23. Sprawdzanie poprawności AJAX Symfony2
- 24. sprawdzanie poprawności django
- 25. Sprawdzanie poprawności moich pieniędzy
- 26. Sprawdzanie poprawności jquery w celu sprawdzenia poprawności adresu URL
- 27. Sprawdzanie poprawności formularza HTML 5 dla danych wejściowych datetime-local
- 28. Jak mogę nakazać Eclipse sprawdzanie poprawności plików HTML jako PHP?
- 29. Jak sprawdzić, czy sprawdzanie poprawności formularza HTML jest zakończone?
- 30. Sprawdzanie poprawności formularza HTML przeglądarki podczas przesyłania za pomocą javascript?
Należy pamiętać, że walidacji różni się od sprzątania! Niektóre z odpowiedzi publikowanych przez użytkowników dotyczą automatycznego korygowania kodu HTML, a nie tylko sprawdzania poprawności kodu HTML. – Flimm