J'essaie de récupérer certaines pages de résultats pour le travail, puis de les imprimer sur un site Web HTML afin que personne n'ait à parcourir manuellement chaque section.
Comment je pourrais éventuellement utiliser: Je nourris cette fonction d'une page de résultats, elle parcourt les 5 sections différentes, puis je peux faire une sortie html (c'est à ça que sert cette zone de remplacement d'impression) avec tous les différents résultats.
OK MASSIVE EDIT J'ai en fait supprimé l'ancien code car je posais trop de questions. J'ai corrigé mon code en prenant quelques suggestions, mais je suis toujours intéressé par l'avantage d'utiliser un dicté lisible par l'homme au lieu d'une simple liste. Voici mon code de travail qui obtient tous les bons résultats dans une «liste de listes», j'ai ensuite sorti la première section de mon éventuel bloc html
import urllib
import re
import string
import sys
def ipv6_results(input_page):
sections = ['/spec.p2/summary.html', '/nd.p2/summary.html',
'/addr.p2/summary.html', '/pmtu.p2/summary.html',
'/icmp.p2/summary.html']
variables_output=[]
for s in sections:
temp_list = []
page = input_page + s
#print page
url_reference = urllib.urlopen(page)
html_page = url_reference.read()
m = re.search(r'TOTAL</B></TD><TD>:</TD><TD>([0-9,]+)', html_page)
temp_list.append(int(m.group(1)) )
m = re.search(r'PASS</B></TD><TD>:</TD><TD>([0-9,]+)', html_page)
temp_list.append(int(m.group(1)))
m = re.search(r'FAIL</FONT></B></TD><TD>:</TD><TD>([0-9,]+)', html_page)
temp_list.append(int(m.group(1)))
variables_output.append(temp_list)
#print variables to check them :)
print "------"
print variables_output
print "Ready Logo Phase 2"
print "Section | Total | Pass | Fail |"
#this next part is eventually going to output an html block
output = string.Template("""
1 - RFC2460-IPv6 Specs $spec_total $spec_pass $spec_fail
""")
print output.substitute(spec_total=variables_output[0][0], spec_pass=variables_output[0][1],
spec_fail=variables_output[0][2])
return 1
Imaginez que la tabulation est correcte :( Je souhaite que cela ressemble plus à un bac à pâte, des suggestions sont les bienvenues sur le collage de code ici
3 réponses
En règle générale, vous ne déclarez pas d'abord la forme de la liste, puis vous remplissez les valeurs. Au lieu de cela, vous créez la liste à mesure que vous découvrez les valeurs.
Votre variables
a beaucoup de structure. Vous avez des listes internes de 3 éléments, toujours dans l'ordre de «total», «réussite», «échec». Peut-être que ces 3 tuples devraient être créés namedtuples. De cette façon, vous pouvez accéder aux trois parties avec des noms humainement reconnaissables (data.total
, data.pass
, data.fail
), au lieu de numéros d'index cryptiques (data[0]
, {{X5} }, data[2]
).
Ensuite, vos 3 tuples diffèrent par des préfixes: 'spec'
, 'nd'
, 'addr'
, etc. Ceux-ci sonnent comme des clés d'un dict plutôt que des éléments d'une liste.
Pensez donc à faire de variables
un dict. De cette façon, vous pouvez accéder au triplet particulier que vous voulez avec le variables['nd']
humainement reconnaissable au lieu de variables[1]
. Et vous pouvez accéder à la valeur nd_fail
avec variables['nd'].fail
au lieu de variables[1][2]
:
import collections
# define the namedtuple class Point (used below).
Point = collections.namedtuple('Point', 'total pass fail')
# Notice we declare `variables` empty at first; we'll fill in the values later.
variables={}
keys=('spec','nd','addr','pmtu','icmp')
for s in sections:
for key in keys:
page = input_page + s
url_reference = urllib.urlopen(page)
html_page = url_reference.read()
m = re.search(r'TOTAL</B></TD><TD>:</TD><TD>([0-9,]+)', html_page)
ntotal = int(m.group(1))
m = re.search(r'PASS</B></TD><TD>:</TD><TD>([0-9,]+)', html_page)
npass = int(m.group(1))
m = re.search(r'FAIL</FONT></B></TD><TD>:</TD><TD>([0-9,]+)', html_page)
nfail = int(m.group(1))
# We create an instance of the namedtuple on the right-hand side
# and store the value in `variables[key]`, thus building the
# variables dict incrementally.
variables[key]=Point(ntotal,npass,nfail)
La première chose est que ces listes ne contiendront que les valeurs des variables, au moment de l'affectation. Vous modifieriez la valeur de la liste, mais pas les variables.
J'envisagerais sérieusement d'utiliser des classes et de construire des structures de celles-ci, y compris des listes d'instances de classe.
Par exemple:
class SectionResult:
def __init__(self, total = 0, pass = 0, fail = 0):
self.total = total
self.pass = pass
self.fail = fail
Comme il semble que chaque groupe devrait être lié à une section, vous pouvez créer une liste de dictionnaires (ou peut-être une liste de classes?) Avec les bits associés à une section:
sections = [{'results' : SectionResult(), 'filename': '/addr.p2/summary.html'}, ....]
Puis dans la boucle:
for section in sections:
page = input_page + section['filename']
url_reference = urllib.urlopen(page)
html_page = url_reference.read()
m = re.search(r'TOTAL</B></TD><TD>:</TD><TD>([0-9,]+)', html_page)
section['results'].total = int(m.group(1))
m = re.search(r'PASS</B></TD><TD>:</TD><TD>([0-9,]+)', html_page)
section['results'].pass = int(m.group(1))
m = re.search(r'FAIL</FONT></B></TD><TD>:</TD><TD>([0-9,]+)', html_page)
section['results'].fail = int(m.group(1))
J'utiliserais un dictionnaire dans une liste. Peut-être quelque chose comme:
def ipv6_results(input_page):
results = [{file_name:'/spec.p2/summary.html', total:0, pass:0, fail:0},
{file_name:'/nd.p2/summary.html', total:0, pass:0, fail:0},
{file_name:'/addr.p2/summary.html', total:0, pass:0, fail:0},
{file_name:'/pmtu.p2/summary.html', total:0, pass:0, fail:0},
{file_name:'/icmp.p2/summary.html', total:0, pass:0, fail:0}]
for r in results:
url_reference = urllib.urlopen(input_page + r[file_name])
html_page = url_reference.read()
m = re.search(r'TOTAL</B></TD><TD>:</TD><TD>([0-9,]+)', html_page)
r[total] = int(m.group(1))
m = re.search(r'PASS</B></TD><TD>:</TD><TD>([0-9,]+)', html_page)
r[pass] = int(m.group(1))
m = re.search(r'FAIL</FONT></B></TD><TD>:</TD><TD>([0-9,]+)', html_page)
r[fail] = int(m.group(1))
for r in results:
print r[total]
print r[pass]
print r[fail]
Questions connexes
De nouvelles questions
python
Python est un langage de programmation multi-paradigme, typé dynamiquement et polyvalent. Il est conçu pour être rapide à apprendre, comprendre, utiliser et appliquer une syntaxe propre et uniforme. Veuillez noter que Python 2 est officiellement hors support à partir du 01-01-2020. Néanmoins, pour les questions Python spécifiques à la version, ajoutez la balise [python-2.7] ou [python-3.x]. Lorsque vous utilisez une variante Python (par exemple, Jython, PyPy) ou une bibliothèque (par exemple, Pandas et NumPy), veuillez l'inclure dans les balises.