2014-07-12 30 views
0

我想打印標籤id,如果它有一個id。如果標籤沒有標識但是有類,我希望它能打印類。如果沒有id或class,我希望它打印標籤名稱(img,h1等)。它只需要一個打印文件,如id或class或tag,但不是全部。它需要始終支持第一個ID,然後是班級,然後是標籤名稱,但只能顯示其中一個。它用於輸出sass(如css)模板。檢查元組列表中的字符串,然後訪問它打印它

我要看看「身份證」是元組名單(它是):

[('class', 'title'), ('id', 'donkey'), ('src', 'images/DonkeyKongLogo.png')] 

列表稱爲ATTRS。這是我的代碼,看看'id'是否在attrs:

它檢查第一個元組,看看下一個元組中的'class'和'title',但沒有'id',所以它進入下一個元組如果聲明(從未找到'id')。任何幫助讚賞。謝謝。

def handle_starttag(self, tag, attrs): 
    if attrs != []: 
     for attr in attrs: 
      if ('id' in attr): 
       id = attr.index('id') 
       self.the_file.writelines(self.indent * self.getpos()[1] + '#' + attr[id+1] + ' {' +'\n') 
       self.pos = self.getpos()[1] 
       break 
      elif ('class' in attr): 
       clas = attr.index('class') 
       self.the_file.writelines(self.indent * self.getpos()[1] + "." + attr[clas+1] + " {"+'\n') 
       self.pos = self.getpos()[1] 
       break 
      else: 
       self.the_file.writelines(self.indent * self.getpos()[1] + tag + " {"+'\n') 
       self.pos = self.getpos()[1] 
       break 
+0

如果這些'break'語句需要保持,那麼你總是**僅限**處理第一個值。在這種情況下,你可以簡單地這樣做:'如果attrs:','attr = attrs [0]'並且去掉'for'循環。但是,這聽起來不對。 –

回答

1

您可以使用一個簡單的列表理解:

>>> attrs = [('class', 'title'), ('id', 'donkey'), ('src', 'images/DonkeyKongLogo.png')] 
>>> 'id' in [item for sub in attrs for item in sub] 
True 
>>> 

要打印的'id''donkey')隨後的值,請執行下列操作:

>>> attrs = [('class', 'title'), ('id', 'donkey'), ('src', 'images/DonkeyKongLogo.png')] 
>>> [item[1] for item in attrs if item[0] == 'id'][0] 
'donkey' 
+0

謝謝!然後,我如何訪問id(驢)的值來打印出來? – user3164083

+0

@ user3164083檢查我的編輯 – ZenOfPython

1

你的元組的列表總是由名稱 - 值對;只需使用for環路與元組拆包:

def handle_starttag(self, tag, attrs): 
    for name, value in attrs: 
     if name == 'id': 
      value = '#' + value 
     elif name == 'class': 
      value = '.' + value 
     elif: 
      value = tag 

     self.the_file.writelines(self.indent * self.getpos()[1] + value + ' {\n') 
     self.pos = self.getpos()[1] 

這種處理attrs元組,不只是第一(這是使用break關鍵字將意味着)。如果你真的想只處理,然後再使用:

if attrs: 
    name, value = attrs[0] 
    if name == 'id': 
     value = '#' + value 
    elif name == 'class': 
     value = '.' + value 
    elif: 
     value = tag 
    self.the_file.writelines(self.indent * self.getpos()[1] + value + ' {\n') 
    self.pos = self.getpos()[1] 

如果你需要測試的某些屬性,你唯一的選擇就是第一掃描的idclass屬性;可能有多個這樣的鍵值對,並且它看起來只是想匹配第一次出現。

幸運的是,一個dict對象將使這很容易,但做反向的鍵值對,以便只有第一idclass鍵值對使用(以相反的順序,他們會重寫任何額外類或ID鍵 - 值對):

attrs_dict = dict(reversed(attrs)) 

if 'id' in attrs_dict: 
    value = '#' + attrs_dict['id'] 
elif 'class' in attrs_dict: 
    value = '.' + attrs_dict['class'] 
else: 
    value = tag 

self.the_file.writelines(self.indent * self.getpos()[1] + value + ' {\n') 
self.pos = self.getpos()[1] 

現在代碼採第一id屬性(如果存在的話),否則第一class屬性,否則使用的標記名。

+0

謝謝。如果html標籤有一個id,我希望值有id。我希望它有類,如果標籤沒有id,但是有一個類。如果沒有id或class,我希望它具有標籤名稱(img,h1等)。它只需要一個,如id或class或tag,但不是全部。這是什麼代碼呢? – user3164083

+0

@ user3164083:它沒有,但我現在添加了一個選項。 –

0

你爲什麼不創建一本字典?

d = dict([('class', 'title'), ('id', 'donkey'), ('src', 'images/DonkeyKongLogo.png')]) 

然後,

In [4]: 'id' in d 
Out[4]: True 

不知道你到底想要什麼在這裏,但我想你可以這樣做:

In [5]: if 'id' in d: print d['id'] 
donkey 

甚至,

In [6]: if 'id' in d: print d['src'] 
images/DonkeyKongLogo.png 

In [7]: if d['id'] == 'donkey': print d['src'] 
images/DonkeyKongLogo.png 

沒有得到你想要的東西我們的代碼...

編輯:

,你已經證明應該寫成的代碼:

def handle_starttag(self, tag, attrs): 
    if attrs != []: 
     d = dict(attrs)    

     # some examples of the dictionary use ... 

     if 'id' in d: print d['id'] 
     if ('id' in d) and (d['id'] == 'donkey') : print d['url'] 
+0

謝謝,我已經更新了我的問題,正是我的代碼所需。你的解決方案很好。但是,我在「In」中出現語法錯誤。如果attrs!= []: d = dict(attrs) In [5]:if'id'in d:print d ['id']' – user3164083

+0

'def handle_starttag(self,tag,attrs): '在[5]中'在iPython解釋器提示符中。你應該在d:print d ['id']'中說'if'id' – ssm

0

拼合所有子元組到一個列表和搜索的屬性,然後它值:

import itertools 

attrs = [('class', 'title'), ('id', 'donkey'), ('src', 'images/DonkeyKongLogo.png')] 

dump = [y for y in itertools.chain(*attrs)] 
#dump = ['class', 'title', 'id', 'donkey' , 'src', 'images/DonkeyKongLogo.png'] 

if 'id' in dump: value = dump[dump.index('id') + 1] 
elif 'class' in dump: value = dump[dump.index('class') + 1] 
else: value = dump[1] 

print value 

這假定如果沒有idclass屬性則屬性將僅具有包含單個元組tagvalue

0
def handle_starttag(self, tag, attrs): 
    id=None 
    clas=None 
    for attr,value in attrs: 
     if attr=='id': 
      id='#'+value 
      break # Only since highest priority 
     elif attr=='class': 
      clas = '.'+value 
    value=id or clas or tag 
    self.the_file.writelines(self.indent * self.getpos()[1] + value + ' {' +'\n') 
    self.pos = self.getpos()[1] 

這使用具有非空字符串,無虛假的的真實性相結合的or的shortcutting行爲。它沒有考慮多個類,但只會選擇最後一個(在elif處添加and not clas以獲得第一個)。一個類似的方法是將屬性列表轉換爲字典,但也只保存每個屬性的最後一個屬性,在這種情況下,我們希望以單獨的方式處理它們(預先安排週期或散列符號)。

另一個變體是使用reduce僅僅定義優先功能:

def prio(cur, (attr,value)): 
    if attr=='id': 
     return '#'+value 
    elif attr=='class' and cur[0] not in '#.': 
     return '.'+value # found a class, and had neither class nor id 
    else: 
     return cur 

的選擇就變成非常簡單:

In [10]: reduce(prio,[('class', 'title'), ('id', 'donkey')],'img') 
Out[10]: '#donkey' 
In [11]: reduce(prio,[('unknown','irrelevant')],'img') 
Out[11]: 'img' 
In [12]: reduce(prio,[('class','foo')],'img') 
Out[12]: '.foo' 
In [13]: reduce(prio,[('class','foo'),('class','bar')],'img') 
Out[13]: '.foo' 
相關問題