2008-08-30 43 views
29

में मान्य (एक्स) एचटीएमएल एचटीएमएल के कुछ संस्करणों का पालन करने के बारे में यह जानने का सबसे अच्छा तरीका क्या है (प्राथमिक रूप से मैं निर्दिष्ट कर सकता हूं)? मैं मूल पाइथन ऐप को छोड़कर, वेब-आधारित सत्यापनकर्ता के रूप में विफलताओं के बारे में जानना चाहता हूं।पाइथन

+0

कृपया ध्यान दें कि मान्यता है tidying से अलग! लोग जो पोस्ट कर रहे हैं उनमें से कुछ उत्तर HTML को स्वचालित रूप से सही करने के बारे में हैं, केवल यह सत्यापित करने के बजाय कि HTML मान्य है या नहीं। – Flimm

उत्तर

8

एक्सएचटीएमएल आसान है, lxml का उपयोग करें।

एचटीएमएल कठिन है, क्योंकि परंपरागत रूप से एचटीएमएल भीड़ के बीच सत्यापन में ज्यादा दिलचस्पी नहीं है (एक वैधकर्ता, यिक्स के माध्यम से खुद को स्टैक ओवरव्लो चलाएं)। सबसे आसान समाधान nsgmls या OpenJade जैसे बाहरी अनुप्रयोगों को निष्पादित करना होगा, और फिर उनके आउटपुट को पार्स करें।

+0

नोट: एलएक्सएमएल लिंक टूटा हुआ है। [यह एक] (http://lxml.de/) का प्रयोग करें, शायद? –

3

मुझे लगता है कि HTML tidy आप जो चाहते हैं वह करेंगे। इसके लिए एक पाइथन बाध्यकारी है।

5

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 

लॉग पार्स आप काफी सब कुछ आप की जरूरत है देना चाहिए।

11

आप स्थानीय रूप से HTML सत्यापनकर्ता स्थापित करने और सत्यापन के अनुरोध के लिए क्लाइंट बनाने का निर्णय ले सकते हैं।

यहां मैंने एक txt फ़ाइल में urls की सूची को सत्यापित करने के लिए एक प्रोग्राम बनाया था। मैं सिर्फ सत्यापन स्थिति प्राप्त करने के लिए सिर की जांच कर रहा था, लेकिन यदि आप प्राप्त करते हैं तो आपको पूर्ण परिणाम मिलेंगे। सत्यापनकर्ता के एपीआई को देखें, इसके लिए बहुत सारे विकल्प हैं।

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 
+2

अफसोस की बात है, 'html5lib' [मान्य नहीं है] (http://stackoverflow.com/a/29992363/593047)। –

22

PyTidyLib एचटीएमएल टिडी के लिए एक अच्छा पायथन बाध्यकारी है। उनके उदाहरण:

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 

इसके अलावा यह दोनों legacy HTML Tidy और new tidy-html5 के साथ संगत है।

+3

डेबियन में पैकेज: पायथन-टिडिलिब – sumid

15

मुझे लगता है कि सबसे खूबसूरत जिस तरह से यह

http://validator.w3.org/ 

प्रोग्राम के रूप में W3C मान्यकरण सेवा आह्वान करने के लिए। कुछ लोगों, पता है कि तुम क्रम परिणाम प्राप्त करने के परिणाम स्क्रीन-स्क्रैप करने की जरूरत नहीं है कि क्योंकि सेवा देता है अमानक 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) 
+6

डब्ल्यू 3 सी वैलिडेटर और एक पाइथन बाध्यकारी के लिए एक पूर्ण वेब सेवा API भी है: https://bitbucket.org/nmb10/py_w3c –

+0

यह यूआरएल अब 302 लौटा रहा है और 200 नहीं। अब काम नहीं करता है! – sreeraag

0

मेरे मामले में पायथन डब्ल्यू 3 सी/एचटीएमएल सत्यापन पैकेज काम नहीं किया pip search w3c (2016 से सितंबर तक)।

मैं

$ 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, ... 

अधिक प्रलेखन यहाँ python requests के साथ इस हल, W3C Validator API

0

यह एक बहुत ही बुनियादी एचटीएमएल lxml के HTMLParser के आधार पर सत्यापनकर्ता है। इसे किसी भी इंटरनेट कनेक्शन की आवश्यकता नहीं है।

_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")