在Python中验证(X)HTML

时间:2020-03-05 18:45:18  来源:igfitidea点击:

验证文档是否遵循某种版本的HTML(最好是我可以指定)的最佳方法是什么?我希望能够知道失败的发生位置,例如在基于Web的验证器中,但在本机Python应用程序中除外。

解决方案

回答

XHTML很简单,使用lxml。

HTML更加困难,因为传统上对HTML人群的验证没有太大兴趣(通过验证器yikes运行StackOverflow本身)。最简单的解决方案是执行诸如nsgmls或者OpenJade之类的外部应用程序,然后解析其输出。

回答

我认为HTML整洁会做我们想要的事情。有一个Python绑定。

回答

尝试tidylib。我们可以在elementtidy模块中获得一些真正的基本绑定(从HTML文档构建elementtrees)。 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

解析日志应该可以为我们提供所需的一切。

回答

我们可以决定在本地安装HTML验证程序,并创建一个客户端以请求验证。

在这里,我制作了一个程序来验证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

回答

PyTidyLib是HTML Tidy的一个不错的python绑定。他们的例子:

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

此外,它与旧的HTML Tidy和新的tidy-html5兼容。