Проверьте фрагмент HTML с помощью html5lib
Я использую Python и html5lib, чтобы проверить, верен ли небольшой HTML-код, введенный в поле формы.
Я попробовал следующий код для проверки правильного фрагмента, но получаю неожиданную ошибку (по крайней мере, для меня):
>>> import html5lib
>>> from html5lib.filters import lint
>>> fragment = html5lib.parseFragment('<p><script>alert("Boo!")</script></p>')
>>> walker = html5lib.getTreeWalker('etree')
>>> [i for i in lint.Filter(walker(fragment))]
Traceback (most recent call last):
File "<console>", line 1, in <module>
File "/xyz/html5lib-1.0b3-py2.7.egg/html5lib/filters/lint.py", line 28, in __iter__
raise LintError(_("Tag name is not a string: %(tag)r") % {"tag": name})
LintError: Tag name is not a string: u'p'
Что я делаю не так?
Моя кодировка по умолчанию utf-8
:
>>> import sys
>>> sys.getdefaultencoding()
'utf-8'
1 ответ
Фильтр lint не пытается проверять HTML (ну, да, документация нужна, это ужасно… это большая часть причины, по которой еще не выпущен релиз 1.0), он просто проверяет, придерживается ли API Treewalker. За исключением того, что это не потому, что он сломан из-за проблемы # 172.
html5lib не пытается предоставить какой-либо валидатор, так как для реализации валидатора HTML требуется много работы.
Я не знаю ни одного достаточно полного валидатора, кроме https://validator.nu/, хотя он написан на Java. Однако он предоставляет веб-API, который может подойти для ваших целей.
"Строгий" режим синтаксического анализа может использоваться для обнаружения ошибок:
>>> import html5lib
>>> html5parser = html5lib.HTMLParser(strict=True)
>>> html5parser.parseFragment('<p>Lorem <a href="/foobar">ipsum</a>')
<Element 'DOCUMENT_FRAGMENT' at 0x7f1d4a58fd60>
>>> html5parser.parseFragment('<p>Lorem </a>ipsum<a href="/foobar">')
Traceback (most recent call last):
...
html5lib.html5parser.ParseError: Unexpected end tag (a). Ignored.
>>> html5parser.parseFragment('<p><form></form></p>')
Traceback (most recent call last):
...
html5lib.html5parser.ParseError: Unexpected end tag (p). Ignored.
>>> html5parser.parseFragment('<option value="example" />')
Traceback (most recent call last):
...
html5lib.html5parser.ParseError: Trailing solidus not allowed on element option