检查元组列表中是否有以定义字符串为第一个元素的元组。

4

我正在解析HTML,需要获取只包含选择器如div.content的标签。

为了解析,我使用HTMLParser。目前我已经得到了标签属性列表。

它看起来像这样:

[('class','content'),('title','source')]

问题是我不知道如何检查:

  1. 列表是否有一个名为class的元组,
  2. 元组第一个元素的值(即第二个元素)是否为content

我知道这是一个简单的问题,但我对Python也很陌生。感谢任何建议!

6个回答

9
当遍历您的元素时:
if ('class', 'content') in element_attributes:
    #do stuff

4
如果你想让这个条件匹配第二个元素的通配符,应该怎么办? - fatuhoku
2
如果你不知道元组中的第二个元素怎么办?我想要这样的东西:if ('key','anyvalue') in list_of_tuples。有没有方法可以做到这一点? - Wajahat

2
l = [('class', 'content'), ('title', 'source')]

('class', 'content') in l

返回True,因为至少有一个元组的第一个元素是'class',第二个元素是'content'。

现在,您可以使用它:

if ('class', 'content') in l:
    # do something

2
值得注意的是,HTML的“class”属性允许是一组用空格分隔的css类。例如,你可以这样写:<span class='green big'>...</span>。听起来你真正想知道的是一个给定的HTML元素是否有特定的CSS类(给定一组(属性,值)对)。在这种情况下,我会使用类似于以下的方法:
element_attributes =  [('class', 'content'), ('title', 'source')]
is_content = any((attr=='class') and ('content' in val.split())
                 for (attr, val) in element_attributes)

当然,如果你确定所有你关心的元素只有一个CSS类,那么sr2222的答案更好/更简单。

1

要检查元组中是否有某个值,可以使用过滤器函数:

tuples_list = [('class', 'content'), ('title', 'source')]
if filter(lambda a: a[0] == 'class', tuples_list):
    # your code goes here
if filter(lambda a: a[1] == 'content', tuples_list):
    # your code goes here

过滤器会给你所有符合条件的元组:
values = filter(lambda a: a[1] == 'content', tuples_list)
# values == [('class', 'content')]

如果您确定它们在同一个元组中:

if ('class', 'content') in tuples_list:
    # your code goes here

0

第一个问题)

if len(list) > 1:
    if list[0][0] == 'class':
        return True`

第二个问题)

for elem in list:
    if elem[1] == 'content':
        return True

注意:据我理解,第二个问题的意思是,如果第二个元组值中有一个是“content”,则你想要true。


0

试试这个:

l = [('class', 'content'), ('title', 'source')]
check = False
for item in l:
  if item[0] == 'class':
    check=True
    print item[1]
print "List have tuple with 1st element called class: %s" check

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接