Я пытаюсь grep некоторые страницы результатов для работы, а затем в конечном итоге распечатать их на веб-сайт html, поэтому кому-то не нужно вручную просматривать каждый раздел.
Как я в конечном итоге буду использовать: я подаю эту функцию на страницу результатов, она проходит через 5 различных разделов, затем я могу сделать вывод html (для чего предназначена эта область для печати) со всеми различными результатами.
OK MASSIVE EDIT Я действительно удалил старый код, потому что задавал слишком много вопросов. Я исправил свой код, принимая некоторые предложения, но меня все еще интересует преимущество использования читаемого человеком dict вместо простого списка. Вот мой рабочий код, который получает все правильные результаты в "список списков", затем я вывел первый раздел в моем возможном 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
представьте себе, что табуляция верна :( Я бы хотел, чтобы это было больше похоже на пачку bin, предложения приветствуются при вставке кода здесь
Как правило, вы сначала не объявляете форму списка, а затем заполняете значения. Вместо этого вы создаете список, когда обнаруживаете значения.
Ваши variables
имеют много структуры. У вас есть внутренние списки из 3 элементов, всегда в порядке "total", "pass", "fail". Возможно, эти 3-кортежи должны быть сделаны именованными. Таким образом, вы можете получить доступ к трем частям с человекозахвачиваемыми именами (data.total
, data.pass
, data.fail
) вместо криптографических индексов (data[0]
, data[1]
, data[2]
).
Затем ваши 3-кортежи отличаются префиксами: 'spec'
, 'nd'
, 'addr'
и т.д. Они звучат как ключи к dict, а не элементы списка.
Поэтому, возможно, подумайте о том, чтобы сделать variables
dict. Таким образом, вы можете получить доступ к определенному 3-кортежу, который вы хотите, с помощью распознаваемых человеком variables['nd']
вместо variables[1]
. И вы можете получить доступ к значению nd_fail
с помощью variables['nd'].fail
вместо 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)
Я бы использовал словарь в списке. Может быть, что-то вроде:
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]
Во-первых, эти списки будут только значениями переменных во время присвоения. Вы изменили бы значение списка, но не переменные.
Я бы серьезно подумал о том, чтобы использовать классы и строить структуры из них, включая списки экземпляров классов.
Например:
class SectionResult:
def __init__(self, total = 0, pass = 0, fail = 0):
self.total = total
self.pass = pass
self.fail = fail
Поскольку похоже, что каждая группа должна связываться с разделом, вы можете создать список словарей (или, возможно, список классов?) С битами, связанными с разделом:
sections = [{'results' : SectionResult(), 'filename': '/addr.p2/summary.html'}, ....]
Затем в цикле:
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))