Validar (X) HTML em Python

votos
29

Qual é a melhor maneira de ir sobre validação de que um documento segue alguma versão do HTML (de preferência que posso especificar)? Eu gostaria de ser capaz de saber onde ocorrem as falhas, como em um validador baseado na web, exceto em um aplicativo Python nativa.

Publicado 30/08/2008 em 02:15
fonte usuário
Em outras línguas...                            


8 respostas

votos
22

PyTidyLib é uma boa ligação para HTML Tidy python. O seu exemplo:

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

Além disso, é compatível com o legado HTML Tidy ea nova arrumada-html5 .

Respondeu 14/08/2009 em 19:04
fonte usuário

votos
15

Eu acho que a maneira mais elegante para chamar o Serviço de Validação W3C em

http://validator.w3.org/

programaticamente. Poucas pessoas sabem que você não tem a tela-raspar os resultados, a fim de obter os resultados, porque o serviço retorna paramaters cabeçalho HTTP não-padrão

X-W3C-Validator-Recursion: 1
X-W3C-Validator-Status: Invalid (or Valid)
X-W3C-Validator-Errors: 6
X-W3C-Validator-Warnings: 0

para indicar a validade eo número de erros e avisos.

Por exemplo, a linha de comando

curl -I "http://validator.w3.org/check?uri=http%3A%2F%2Fwww.stalsoft.com"

retornos

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

Assim, você pode elegantemente chamar o Serviço de Validação W3C e extrair os resultados do cabeçalho 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)
Respondeu 09/05/2012 em 16:53
fonte usuário

votos
11

Você pode decidir instalar o validador HTML localmente e criar um cliente para solicitar a validação.

Aqui eu tinha feito um programa para validar uma lista de URLs em um arquivo txt. Eu estava apenas verificando a cabeça para conseguir o status de validação, mas se você fizer um GET que se obtém os resultados completos. Olhe para a API do validador, há uma abundância de opções para ele.

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
Respondeu 14/03/2009 em 23:42
fonte usuário

votos
8

XHTML é fácil, use lxml .

HTML é mais difícil, uma vez que há tradicionalmente não foi tanto interesse na validação entre a multidão HTML (executar StackOverflow-se através de um validador, yikes). A solução mais simples seria a de executar aplicações externas, tais como o nsgmls ou OpenJade , e, em seguida, analisar a sua saída.

Respondeu 30/08/2008 em 02:20
fonte usuário

votos
5

Tente tidylib. Você pode obter algumas ligações realmente básicos como parte do módulo elementtidy (constrói elementtrees de documentos 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

Analisar o log deve dar-lhe praticamente tudo que você precisa.

Respondeu 30/08/2008 em 02:55
fonte usuário

votos
3

Eu acho que HTML arrumado vai fazer o que quiser. Há uma ligação para ele Python.

Respondeu 30/08/2008 em 02:48
fonte usuário

votos
0

Este é um validador HTML muito básico com base em HTMLParser de lxml. Ele não requer qualquer ligação à 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)

Note que isso não irá verificar se há marcas de fechamento, assim, por exemplo, o seguinte vai passar:

validate_html("<a href='example.com'>foo</a>")

No entanto, o seguinte não vai:

validate_html("<a href='example.com'>foo</a")
Respondeu 24/10/2016 em 23:11
fonte usuário

votos
0

No meu caso, os pacotes de validação python W3C / HTML não funcionou pip search w3c(a partir de setembro 2016).

Eu resolvi isso com

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

Mais documentação aqui solicitações python , W3C Validador API

Respondeu 05/09/2016 em 19:30
fonte usuário

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