سؤال

ما هي أفضل طريقة للتحقق من أن المستند يتبع إصدارًا ما من HTML (ويفضل أن أستطيع تحديد ذلك)؟أود أن أكون قادرًا على معرفة مكان حدوث حالات الفشل، كما هو الحال في أداة التحقق من الصحة المستندة إلى الويب، باستثناء تطبيق Python الأصلي.

هل كانت مفيدة؟

المحلول

XHTML سهل الاستخدام com.lxml.

يعد HTML أصعب، نظرًا لعدم وجود اهتمام كبير بالتحقق من الصحة بين جمهور HTML (قم بتشغيل StackOverflow نفسه من خلال أداة التحقق من الصحة، نعم).الحل الأسهل هو تنفيذ التطبيقات الخارجية مثل nsgmls أو أوبن جايد, ، ثم قم بتحليل مخرجاتها.

نصائح أخرى

بيتيديليب هو رابط بيثون لطيف لـ HTML Tidy.مثالهم:

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 القديم مرتب و ال جديد مرتب-html5.

أعتقد أن الطريقة الأكثر أناقة هي استدعاء خدمة التحقق من صحة 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)

يمكنك أن تقرر تثبيت أداة التحقق من صحة HTML محليًا وإنشاء عميل لطلب التحقق من الصحة.

لقد قمت هنا بإنشاء برنامج للتحقق من صحة قائمة عناوين URL في ملف txt.لقد كنت أتحقق فقط من الرأس للحصول على حالة التحقق من الصحة، ولكن إذا قمت بإجراء 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

جرب تيديليب.يمكنك الحصول على بعض الروابط الأساسية كجزء من وحدة elementtidy (إنشاء أشجار العناصر من مستندات 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 مرتب سوف تفعل ما تريد.هناك رابط بايثون لذلك.

في حالتي، لم تعمل حزم التحقق من صحة python W3C/HTML 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, ...

مزيد من الوثائق هنا طلبات بايثون, واجهة برمجة تطبيقات التحقق من صحة W3C

هذا هو مدقق HTML أساسي للغاية يعتمد على HTMLParser الخاص بـ lxml.أنها لا تتطلب أي اتصال بالإنترنت.

_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")
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top