2014-07-12 26 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' 
相关问题