2011-11-04 3 views
1

작업 결과 페이지를 grep하려고 시도하고 결국 HTML 웹 사이트로 출력하여 누군가가 각 섹션을 수동으로 살펴볼 필요가 없도록했습니다.목록 목록을 파이썬에서 올바르게 처리하려면 어떻게해야합니까? 특히 함수 목록이 있습니다.

나는 결국 사용하는 것이 방법 : 나는 결과 페이지가, 그것은 5 개 가지 섹션을 greps이 기능을 공급을, 그때는 HTML 출력을 할 수있는 모든 다른 결과 (즉, 인쇄 대체 지역을 위해 무엇을 먹으 렴) .

OK MASSIVE EDIT 너무 많은 질문을했기 때문에 나는 실제로 이전 코드를 삭제했습니다. 필자는 코드를 수정하여 몇 가지 제안을했지만 필자는 여전히 목록 대신 사람이 읽을 수있는 dict을 사용하는 이점에 관심이 있습니다. 여기에 '목록 목록'에 모든 권리 결과를 얻을 내 작업 코드는, 그때

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 

이 탭 이동이 올바른지 :(나는이 비슷한 제품을 더 좋겠어요 상상 내 최종 HTML 블록의 첫 번째 부분을 출력 붙여 넣기 빈은, 제안 당신이 값을 입력 한 후 첫 번째 목록의 모양을 선언하지 않으며, 일반적으로 여기

답변

3

에 붙여 넣기 코드를 환영합니다. 당신이 값을 발견으로 대신 당신이 목록을 구축 할 수 있습니다.

variables은 많은 구조를 가지고 있습니다. 3 개의 요소로 구성된 내부 목록을 항상 '합계', '합격', '실패'순으로 표시합니다. 이 3 튜플은 namedtuples으로 만들어야합니다. 이렇게하면 암호문 번호 (data[0], , data[2]) 대신 인간이 인식 할 수있는 이름 (data.total, data.pass, data.fail)으로 세 부분에 액세스 할 수 있습니다. 'spec', 'nd', 'addr' 등 아니라리스트의 요소보다 딕셔너리 열쇠 등이 음 :

다음하여 3- 튜플은 접두어가 다르다.

아마도 variables을 dict라고 생각하십시오. 그렇게하면 variables[1] 대신 인간이 인식 할 수있는 variables['nd']을 사용하여 원하는 3 중 튜플에 액세스 할 수 있습니다. 그리고 당신은 variables['nd'].fail 대신 variables[1][2]으로 nd_fail 값에 액세스 할 수 있습니다

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) 
+0

이있는 좋은 학습 포인트 ...이 문제를하지만, 패스 파이썬 예약어 분명히입니다 :)이 아직도 내가 사양에 대해 동일한 결과를 가지고 문제가 해결되지 않습니다 nd/addr/pmtu/icmp. 나는 그것을 덮어 썼습니다 ... 비록 다른 방법을 사용하여 그것을 고정했지만, 당신의 방법은 인간이 읽을 수있는 방법입니다, 나는 다시 게시하고 사람들이 내가 파이썬 방법을 배우는 것을 도울 수 있는지보고 싶습니다. 매우 기계 C 방법 '여기에 조언을 주셔서 감사합니다, 매일 학습 –

+0

편집 추가 위에 –

0

가장 먼저하는 일이 그 목록 만 할당시, 변수의 값이 될 것입니다. 목록 값은 변경하지만 변수는 변경하지 않습니다.

나는 클래스 사용을 심각하게 고려하고 클래스 인스턴스 목록을 포함하여 그것들의 구조를 만들 것이다. 이 섹션와 연결해야 각 그룹처럼 보이는 때문에

class SectionResult: 
    def __init__(self, total = 0, pass = 0, fail = 0): 
    self.total = total 
    self.pass = pass 
    self.fail = fail 

, 당신은 섹션과 관련된 비트 사전의 목록 (? 또는 클래스 아마도 목록)를 만들 수 있습니다 : 예를 들어

: 나는 내부 사전을 사용

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

: 루프에서 다음

sections = [{'results' : SectionResult(), 'filename': '/addr.p2/summary.html'}, ....] 

명부.아마 뭔가 같은 :/

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] 
관련 문제