#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, для того, что я хочу, мне вообще не нужно использовать перечисление, благодаря обоим!