Какой лучший способ проверить, что документ следует за некоторой версией HTML (желательно, что я могу указать)? Я хотел бы знать, где происходят сбои, как в веб-валидаторе, за исключением встроенного приложения Python.
Проверка (X) HTML в Python
Ответ 1
XHTML легко, используйте lxml.
HTML сложнее, поскольку традиционно не так много интереса к валидации среди толпы HTML (запустите StackOverflow через валидатор, yikes). Самое простое решение - выполнить внешние приложения, такие как nsgmls или OpenJade, а затем проанализировать их вывод.
Ответ 2
PyTidyLib - хорошая привязка python для HTML Tidy. Их пример:
from tidylib import tidy_document
document, errors = tidy_document('''<p>fõo <img src="bar.jpg">''',
options={'numeric-entities':1})
print document
print errors
Кроме того, он совместим с устаревшим HTML Tidy и new опрятный-html5.
Ответ 3
Я думаю, что самый элегантный способ вызвать службу валидации W3C в
http://validator.w3.org/
программно. Мало кто знает, что вам не нужно скринировать результаты, чтобы получить результаты, потому что служба возвращает нестандартные параметры HTTP-заголовка
X-W3C-Validator-Recursion: 1
X-W3C-Validator-Status: Invalid (or Valid)
X-W3C-Validator-Errors: 6
X-W3C-Validator-Warnings: 0
для указания действительности и количества ошибок и предупреждений.
Например, в командной строке
curl -I "http://validator.w3.org/check?uri=http%3A%2F%2Fwww.stalsoft.com"
возвращает
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
Таким образом, вы можете элегантно вызвать службу проверки W3C и извлечь результаты из 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)
Ответ 4
Вы можете установить локализацию HTML-проверки и создать клиент для запроса подтверждения.
Здесь я сделал программу для проверки списка URL-адресов в файле txt. Я просто проверял HEAD, чтобы получить статус проверки, но если вы сделаете GET, вы получите полные результаты. Посмотрите на API валидатора, есть много вариантов для него.
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
Ответ 5
Попробуйте тидилиб. Вы можете получить некоторые базовые привязки как часть модуля elementtidy (создает элементы из 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
Анализ журнала должен дать вам почти все, что вам нужно.
Ответ 6
Я думаю, что HTML tidy будет делать то, что вы хотите. Для него существует привязка Python.
Ответ 7
В моем случае пакеты проверки подлинности W3C/HTML python не работали pip search w3c
(по состоянию на 2016).
Я решил это с помощью
$ 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, ...
Дополнительная документация здесь запросы python, W3C Validator API
Ответ 8
Это очень простой html-валидатор, основанный на lxml HTMLParser. Он не требует подключения к Интернету.
_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)
Обратите внимание, что это не будет проверять закрытие тегов, например, следующее:
validate_html("<a href='example.com'>foo</a>")
Однако, следующее условие:
validate_html("<a href='example.com'>foo</a")