如何驗證文檔是否遵循某個HTML版本(我可以指定優先)?我希望能夠知道失敗發生的位置,例如在基於Web的驗證器中,除了原生Python應用程序。在Python中驗證(X)HTML
回答
我認爲HTML tidy會做你想做的。它有一個Python綁定。
嘗試tidylib。你可以得到一些真正基本的綁定作爲元素模塊的一部分(從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
解析日誌應該給你幾乎所有你需要的東西。
您可以決定在本地安裝HTML驗證程序並創建一個客戶端來請求驗證。
這裏我做了一個程序來驗證一個txt文件中的URL列表。我只是檢查頭部以獲得驗證狀態,但如果您執行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
不幸的是,`html5lib` [不驗證](http://stackoverflow.com/a/29992363/593047)。 – 2017-01-25 01:15:39
PyTidyLib是一個不錯的Python Tidy的Python綁定。他們的例子:
from tidylib import tidy_document
document, errors = tidy_document('''<p>fõo <img src="bar.jpg">''',
options={'numeric-entities':1})
print document
print errors
而且它與兩個legacy HTML Tidy和new tidy-html5兼容。
Debian中的軟件包:python-tidylib – sumid 2012-10-22 22:26:15
我覺得最優雅的方式,來調用W3C驗證服務在
http://validator.w3.org/
編程。很少有人知道,你不必爲了得到結果屏幕刮的結果,因爲服務返回非標準的HTTP標頭PARAMATERS
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)
W3C Validator還有一個完整的Web服務API和一個Python綁定到它:https://bitbucket.org/nmb10/py_w3c – 2012-05-09 16:22:30
在我的情況下,python W3C/HTML驗證包不起作用pip search w3c
(截至2016年9月)。
我解決了這個在這裏python requests
$ 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, ...
更多的文檔,W3C Validator API
這是一個基於LXML的HTMLParser的一個非常基本的HTML驗證。它不需要任何互聯網連接。
_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")
- 1. 在Python中驗證HTML/RDFa
- 2. (X)HTML + CSS驗證警告
- 3. 在Python中驗證對端
- 4. 在mongodb python中驗證
- 5. 在Python中驗證字典
- 6. 在Python中驗證URL
- 7. x 509根證書驗證
- 8. 在SAPUI5中X-CSRF-TOKEN驗證失敗
- 9. 使用xsd在x ++中驗證xml
- 10. 驗證碼在python
- 11. 如何在python中驗證SSL證書?
- 12. 將Python驗證腳本與HTML集成
- 13. Python驗證 - 現場驗證
- 14. 如何在Python中驗證/驗證X509證書信任鏈?
- 15. Joomla HTML驗證
- 16. Html驗證PHP
- 17. HTML驗證
- 18. HTML-Javascript驗證
- 19. 聚合物1.x nl2br或要求驗證模板中的html
- 20. 如何在W3C驗證器中驗證HTML時獲取徽章?
- 21. jQuery驗證TextArea中的HTML
- 22. Java中的HTML驗證器
- 23. Java中的HTML驗證
- 24. 驗證在HTML不工作
- 25. HTML表單驗證在JS
- 26. JWT驗證Python
- 27. 在python中驗證表達式/中綴
- 28. 在JavaScript和HTML中輸入驗證
- 29. 在C中驗證HTML日曆工具#
- 30. 在硒腳本中驗證Html示例
請注意,驗證與整理不同!人們發佈的一些答案是關於自動更正HTML,而不是僅僅驗證HTML是否有效。 – Flimm 2017-05-26 12:00:49