2014-12-26 7 views
0

python 3.4에서 fiddly html 테이블을 만드는 데 문제가 있습니다. templater는 html 1.16입니다. 다음은 문제의 단순화 된 버전입니다. 목록을 탐색하고 싶습니다. 각 목록 항목에 대해 html 테이블에 데이터를 쓰고 싶습니다. 테이블은 2 열 너비가 있어야합니다.html templater로 연결할 수없는 코드 블록 (파이썬에서)

from html import HTML 
#create html object 
h = HTML() 
comments=["blah1", 
     "blah2", 
     "blah3" 
     ] 

#create table object 
c_table = h.table.tbody 
for i, comment in enumerate(comments): 
    #create row if we are at an odd index 
    if i % 2 != 0: 
     row = c_table.tr 
     row.td(comment) 
    else: 
     #it is intended to add another <td> to the current row here 
     #but because the row was declared in the if block, it is out of scope 
     row.td(comment) 

#write the html output now 
print(h) 

어려움은 특히, templater 함께 다음 </tr> 종료 태그시키지 않고 로우의 제 2 셀의 행 오브젝트 액세스. row 개체를 통해 새 셀을 만들어야합니다. 그렇지 않으면 c_table.tr.td을 호출하면 행이 </tr>으로 닫히고 새 셀이 시작됩니다.

이러한 상황에서 내가하려는 일을 성취하는 모든 코드 속임수를 영리하게 생각할 수 있습니까?

답변

2

댓글이 잘못되었습니다. 파이썬에는 블록 범위가 없으며 if 블록에 정의 된 행은 else에서 액세스 할 수 있습니다.

사실 if 블록에서 td를 꺼내서 else 블록을 모두 제거 할 수 있습니다.

+0

당신의 대답은 것 같다 부정확하다. 블록에서'row.td (comment)'를 제거하고 else 블록을 제거하면'NameError : name '행이'정의되지 않음 '을 얻습니다. 마찬가지로 코드를 그대로 실행하면 마찬가지입니다. 샘플 코드는 통역사에게 직접 붙여 넣을 수 있어야합니다 ... – Escher

+0

논리가 잘못 되었기 때문입니다. 인덱스는 0부터 시작하므로, 처음으로 루프 'i % 2'을 통해 0이되고 행이 정의되지 않습니다. '! ='를'=='로 변경해야합니다. –

+0

알았어. 내 얼굴에 거대한 facepalm. 다니엘 고마워. – Escher

0

첫 번째 if 내부에서 생성 되었기 때문에 해당 행 개체에 액세스 할 수 없습니다. "else"에서 액세스하려면 두 절 외부에서 만들어야하는데 이는 목표를 달성하는 데 도움이되지 않습니다.

목록을 "청크"로 나눠보십시오. 청크는 각각 두 개의 개체가있는 목록입니다.

h = HTML() 
comments=["blah1", 
     "blah2", 
     "blah3", 
     "blah4", 
     "blah5" 
     ] 

fixed_list = [] 
for i in xrange(0, len(comments), 2): 
    fixed_list.append(comments[i:i+2]) 

이제 고정 된 목록은 다음과 같습니다 -

[["blah1", "blah2"], ["blah3", "blah4"], .....] 

을 그리고 지금 당신은 쉽게 그 목록을 반복하고, 각 목록의 행을 만들 수 있습니다 -

#create table object 
body = h.body 
tb = body.table 

for comments_list in fixed_list: 
    row = tb.tr 
    for comment in comments_list: 
     row.td(comment) 

print h 
관련 문제