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

1
Sean Cav 5 nov. 2011 à 01:24

3 réponses

Meilleure réponse

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)
3
unutbu 4 nov. 2011 à 21:44

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))
0
Danny Staple 4 nov. 2011 à 21:43

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]
0
Kris 4 nov. 2011 à 21:56
8015905