40

ドキュメントがHTMLのバージョン(できれば私が指定できるもの)に従っていることを検証するための最良の方法は何ですか?ネイティブのPythonアプリを除いて、Webベースのバリデーターの場合と同様に、障害が発生する場所を知りたいのですが。

4

9 に答える 9

32

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の両方と互換性があります。

于 2009-08-14T18:04:38.743 に答える
16

XHTMLは簡単です。lxmlを使用してください。

from lxml import etree
from StringIO import StringIO
etree.parse(StringIO(html), etree.HTMLParser(recover=False))

従来、HTML群集の間で検証にそれほど関心がなかったため、HTMLはより困難です(StackOverflow自体をバリデーターを介して実行します)。最も簡単な解決策は、 nsgmlsOpenJadeなどの外部アプリケーションを実行してから、それらの出力を解析することです。

于 2008-08-30T01:20:52.157 に答える
15

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
# mhepp@computer.org / alex.stolz@ebusiness-unibw.org

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)
于 2012-05-09T15:53:46.180 に答える
11

HTML バリデーターをローカルにインストールし、検証を要求するクライアントを作成することができます。

ここでは、txt ファイル内の URL のリストを検証するプログラムを作成しました。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
于 2009-03-14T22:42:12.123 に答える
6

tidylibを試してください。elementtidyモジュールの一部としていくつかの本当に基本的なバインディングを取得できます(HTMLドキュメントからelementtreeを構築します)。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

ログを解析すると、必要なほとんどすべてが得られるはずです。

于 2008-08-30T01:55:50.170 に答える
2

HTMLtidyはあなたが望むことをするだろうと思います。そのためのPythonバインディングがあります。

于 2008-08-30T01:48:07.800 に答える