Убедитесь, что список кортежей имеет кортеж с 1-м элементом в виде определенной строки - PullRequest
4 голосов
/ 14 марта 2012

Я анализирую HTML, и мне нужно получить только теги с селектором, например div.content.

Для анализа я использую HTMLParser .Я так далеко, что я получаю список атрибутов тегов.

Это выглядит примерно так:

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

Проблема в том, что я не знаюкак проверить, что:

  1. Список имеет кортеж с 1-м элементом с именем class,
  2. Значения 1-го элемента кортежей (это будет 2-й элемент): content;

Я знаю, что это простой вопрос, но я и новичок в Python.Спасибо за любой совет!

Ответы [ 6 ]

9 голосов
/ 14 марта 2012

При циклическом просмотре ваших элементов:

if ('class', 'content') in element_attributes:
    #do stuff
2 голосов
/ 14 марта 2012

Стоит отметить, что атрибуты 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 лучше / проще.

2 голосов
/ 14 марта 2012
l = [('class', 'content'), ('title', 'source')]

('class', 'content') in l

возвращает True, потому что есть по крайней мере один кортеж с 'class' в качестве первого и 'content' в качестве второго элемента.

Теперь вы можете использовать его:

if ('class', 'content') in l:
    # do something
1 голос
/ 15 апреля 2015

Чтобы проверить, имеет ли один из элементов кортежа какое-либо значение, вы можете использовать функцию фильтра:

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

Фильтр выдает вам все кортежи, соответствующие вашим условиям:Вы уверены, что они находятся в одном кортеже:

if ('class', 'content') in tuples_list:
    # your code goes here
0 голосов
/ 14 марта 2012

Попробуйте это:

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
0 голосов
/ 14 марта 2012

1-й вопрос)

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

2-й вопрос)

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

примечание: из того, что я понял, 2-й вопрос означает, что если ОДИН из 2-х значений кортежа является 'content', то вы хотите true.

...