Изучая Python BeautifulSoup, почему я должен использовать два элемента в цикле For?

#python #for-loop #object #beautifulsoup #new-operator

Вопрос:

Я практикуюсь в веб-очистке с помощью BS, мне удалось извлечь нужную информацию с помощью цикла For и перечислить, но по какой-то причине мне приходится использовать два элемента в цикле For, потому что если нет, это не работает.

Позвольте мне подробно объяснить, сначала я выбираю теги, содержащие нужную мне информацию, и сохраняю их в объекте BS, в этом случае тег:

  <code>"Some text im interested in"</code>
 

Поэтому я выбрал его таким образом

 tags = soup.select("code")
 

но «теги» — это объект BS, который некрасив и содержит всю строку с тегом, поэтому я использую метод getText() для него следующим образом:

 tags[1].getText()
 

Это позволяет мне извлечь строку первой записи объекта tags BS.
Чтобы я мог извлечь всю информацию так, как я хочу, я реализую цикл For, перечисляющий и повторяющий объект BS и добавляющий результат в список, позвольте мне показать вам мою функцию:

 def my_function(bs_object):
   new_list = []
   for i in enumerate(bs_object):
       data_entry = bs_object[i].getText()
       new_list.append(data_entry)
   return new_list
 

Но по какой-то причине вышеуказанная функция не работает, проводя исследования, я обнаружил, что она работает, если я сделаю это:

 def my_function(bs_object):
   new_list = []
   for i, item in enumerate(bs_object):
       data_entry = bs_object[i].getText()
       new_list.append(data_entry)
   return new_list
 

Я хочу понять, почему это происходит? что делает второй элемент «элемент» в цикле For?
Или, может быть, я делаю соскоб не лучшим образом? должен ли я использовать другой метод?

Комментарии:

1. Функция перечисления предназначена для возврата двух значений: индекса и значения в этой позиции индекса в списке. Поскольку вам не нужно значение для вашего цикла, вместо перечисления вы можете использовать for i in range(len(bs_object))

2. На самом деле, вам вообще не нужен индекс. вы могли бы просто использовать: for item in bs_object: data_entry = item.getText() , что более по-питонски.

Ответ №1:

С помощью функции перечисления вы повторяете не только сам объект, но и получаете индекс!

 colors = ["green", "blue", "red"]
 

без перечисления:

 for c in colors:
    print(c) 
 

выход:

 green
blue
red
 

но с помощью enumerate теперь вы также можете получить индекс!
Это иногда полезно иметь.

 for i, c in enumerate(colors):
    print(c) 
    print(i) 
 

выход:

 green
0
blue
1
red
2
 

Поэтому, если вам не нужен индекс, вам не нужно использовать перечисление.

Комментарии:

1. Спасибо за подробное объяснение! Теперь я понимаю, так как я использовал метод перечисления, мне нужны были оба элемента, но, как упоминает @RufusVS, для того, что я хочу, мне вообще не нужно использовать перечисление, благодаря обоим!