2014-11-05 213 views
0

我有兩個輸入文件:一個html和一個css。我想根據css文件的內容對html文件進行一些操作。嵌套for循環迭代停止

我的HTML是這樣的:(!分別爲每個跨度ID)

<html> 
<head> 
     <title></title> 
    </head> 
    <body> 
    <p class = "cl1" id = "id1"> <span id = "span1"> blabla</span> </p> 
    <p class = "cl2" id = "id2"> <span id = "span2"> blablabla</span> <span id = "span3"> qwqwqw </span> </p> 
    </body> 
    </html> 

風格跨度ID在CSS文件中定義

立足於做真正的東西(跨度刪除之前他們樣式)我只是想從HTML打印出ID和從每個ID對應的CSS風格descritption。

代碼:

from lxml import etree 

tree = etree.parse("file.html") 

filein = "file.css" 


def f1(): 

    with open(filein, 'rU') as f: 
     for span in tree.iterfind('//span'): 
      for line in f: 
       if span and span.attrib.has_key('id'): 
        x = span.get('id') 
        if "af" not in x and x in line: 
          print x, line 
def main(): 
    f1() 

所以,有兩個for循環,它遍歷完美,如果分開了,但如果這個功能放在一起,第一循環之後的迭代停止:

>> span1 span`#span1 { font-weight: bold; font-size: 11.0pt; font-style: normal; letter-spacing: 0em } 

我怎樣才能解決這個問題?

回答

1

如果因爲我認爲,樹是完全加載到內存中,你可以嘗試扭轉循環。這樣,您只能瀏覽文件filein一次:

def f1(): 

    with open(filein, 'rU') as f: 
     for line in f: 
      for span in tree.iterfind('//span'): 
       if span and span.attrib.has_key('id'): 
        x = span.get('id') 
        if "af" not in x and x in line: 
          print x, line 
+0

謝謝!它完美的作品:) – user3241376 2014-11-05 15:42:39

1

發生這種情況是因爲您已經讀取了所有文件行,直到第二個外部循環開始。 要使其工作,你需要在FILEIN開始內環前添加f.seek(0):

with open(filein, 'rU') as f: 
    for span in tree.iterfind('//span'): 
     f.seek(0) 
     for line in f: 
      if span and span.attrib.has_key('id'): 
       x = span.get('id') 
       if "af" not in x and x in line: 
         print x, line 
+0

謝謝你的提示!我不知道這個尋找功能。 спасибо)) – user3241376 2014-11-05 15:44:04