如何在 Python2 中离线验证 xHtml1.1 文档

How to Validate xHtml1.1 document offline in Python2

提问人:Sebo.PL 提问时间:7/9/2018 最后编辑:sydneymiyaSebo.PL 更新时间:7/10/2018 访问量:200

问:

我需要设置一个测试方法来验证作为 Python 字符串提供的标记是否有效 xHtml1.1

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">

由于这将在内部 CI 上运行,因此它必须能够在不将内容发送到任何外部服务的情况下进行处理(我不想使用像 https://validator.w3.org/ 这样的在线验证器,但得到类似的结果)。

我发现的是 https://lxml.de/validation.html#id1,看起来很有希望。问题是我被困在获取有效的 DTD 上。

from lxml.etree import DTD
dtd = DTD(external_id = "-//W3C//DTD XHTML 1.1//EN")

这对我不起作用:(

---------------------------------------------------------------------------
DTDParseError                             Traceback (most recent call last)
<ipython-input-13-c6bf8522a141> in <module>()
----> 1 dtd = DTD(external_id = "-//W3C//DTD XHTML 1.1//EN")

/tmp/tmp.dWRxTnmLqz/venv/lib/python2.7/site-packages/lxml/etree.so in lxml.etree.DTD.__init__()

DTDParseError: error parsing DTD
python-2.7 xhtml lxml w3c验证

评论


答:

0赞 Sebo.PL 7/10/2018 #1

我发现软件包提供了缺少的 DTD,因此安装后不再提出此问题:w3c-sgml-libDTDParseError

 sudo apt install w3c-sgml-lib libxml2

至于现在,我正在使用 Python2 代码进行 xHtml1.1 验证,类似于下面:

 #!/usr/bin/env python2
 # vim: set fileencoding=utf-8 :
 #
 # This is an example for https://stackoverflow.com/q/51236003/388968
 #
 # Copyright 2018 (c) Sebastian Sawicki (0x52fb0d10)
 #  OPENPGP4FPR:5691BED8E6CA579830842DD85CB361E552FB0D10
 #
 # Licence: https://creativecommons.org/licenses/by/4.0/
 #

 from lxml.etree import DTD
 from lxml.etree import fromstring

 from six import string_types

 def isValidXHtml11(s):
  return isinstance(s, string_types) and
   s.startswith('<?xml version="1.0" encoding="UTF-8"?>\n' +
   '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" ' +
   '"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">\n') and
   DTD(external_id = '-//W3C//DTD XHTML 1.1//EN').validate(
    fromstring(response.body)
   )

...无论如何,这是对任何建议或改进开放的。