Επικύρωση (X) HTML στην Python

ψήφοι
29

Ποιος είναι ο καλύτερος τρόπος να πάει για επικύρωση ότι ένα έγγραφο που ακολουθεί κάποια έκδοση της HTML (κατά προτίμηση ώστε να μπορώ να προσδιορίσετε); Θα ήθελα να είναι σε θέση να γνωρίζουν πού συμβαίνουν οι αποτυχίες, όπως σε ένα web-based validator, εκτός από την μητρική Python app.

Δημοσιεύθηκε 30/08/2008 στις 00:15
πηγή χρήστη
Σε άλλες γλώσσες...                            


8 απαντήσεις

ψήφοι
8

XHTML είναι εύκολο, χρησιμοποιήστε lxml .

HTML είναι πιο δύσκολο, δεδομένου ότι υπάρχει παραδοσιακά δεν ήταν τόσο μεγάλο ενδιαφέρον στην επικύρωση ανάμεσα στο πλήθος HTML (τρέχει το ίδιο StackOverflow μέσω επικύρωσης, yikes). Ο ευκολότερος λύση θα ήταν να εκτελέσει εξωτερικές εφαρμογές όπως nsgmls ή OpenJade , και στη συνέχεια να αναλύσει την παραγωγή τους.

Απαντήθηκε 30/08/2008 στις 00:20
πηγή χρήστη

ψήφοι
3

Νομίζω ότι η τακτοποίηση HTML θα κάνει ό, τι θέλετε. Υπάρχει μια δεσμευτική για την Python.

Απαντήθηκε 30/08/2008 στις 00:48
πηγή χρήστη

ψήφοι
5

Δοκιμάστε tidylib. Μπορείτε να πάρετε μερικές πολύ βασικές συνδέσεις στο πλαίσιο της elementtidy μονάδα (χτίζει elementtrees από έγγραφα 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

Την ανάλυση του αρχείου καταγραφής θα πρέπει να σας δώσει λίγο πολύ όλα όσα χρειάζεστε.

Απαντήθηκε 30/08/2008 στις 00:55
πηγή χρήστη

ψήφοι
11

Μπορείτε να αποφασίσετε να εγκαταστήσετε το επικύρωσης 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
Απαντήθηκε 14/03/2009 στις 21:42
πηγή χρήστη

ψήφοι
22

PyTidyLib είναι ένα ωραίο python δεσμευτική για 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 Tidy και το νέο τακτοποιημένο-HTML5 .

Απαντήθηκε 14/08/2009 στις 17:04
πηγή χρήστη

ψήφοι
15

Νομίζω ότι το πιο κομψό τρόπο για να επικαλεστούν την Υπηρεσία W3C Επικύρωση σε

http://validator.w3.org/

προγραμματισμού. Λίγοι άνθρωποι γνωρίζουν ότι δεν έχετε στην οθόνη-ξύσει τα αποτελέσματα, προκειμένου να πάρει τα αποτελέσματα, επειδή η υπηρεσία επιστρέφει μη-τυπική paramaters κεφαλίδα 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)
Απαντήθηκε 09/05/2012 στις 14:53
πηγή χρήστη

ψήφοι
0

Στην περίπτωσή μου τα πακέτα επικύρωση 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, ...

Περισσότερα τεκμηρίωση εδώ αιτήματα python , το W3C Validator API

Απαντήθηκε 05/09/2016 στις 18:30
πηγή χρήστη

ψήφοι
0

Αυτό είναι ένα πολύ βασικό επικύρωσης HTML με βάση HTMLParser lxml του. Δεν απαιτείται καμία σύνδεση στο internet.

_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")
Απαντήθηκε 24/10/2016 στις 22:11
πηγή χρήστη

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more