Динамически менять диапазон в Python? - PullRequest
1 голос
/ 03 мая 2009

Скажем, я использую BeautifulSoup для анализа страниц, и мой код обнаруживает, что в запросе есть как минимум 7 страниц.

Нумерация страниц выглядит как

 1 2 3 4 5 6 7 Next

Если я выполняю нумерацию страниц до 7, иногда их бывает больше 7, так что если я нахожусь на странице 7, нумерация страниц выглядит как

 1 2 3    7 8 9 10 Next

Итак, теперь я знаю, что есть еще как минимум 3 страницы. Я использую начальный проход, чтобы выяснить, сколько страниц, т.е. get_num_pages возвращает 7

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

for page in range(1,num_pages + 1):
  # do some stuff here

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

Ответы [ 3 ]

6 голосов
/ 03 мая 2009

Возможно, вы могли бы создать генератор, который имеет изменяемое состояние, которое определяет, когда он завершается ... но как насчет чего-то простого?

page = 1
while page < num_pages + 1:
    # do stuff that possibly updates num_pages here
    page += 1
2 голосов
/ 03 мая 2009

Вот ответ без кода, но я думаю, что это просто, если вы воспользуетесь тем, что позволяет делать красивый суп:

Для начала, на первой странице у вас есть номера страниц и ссылки; от вашего вопроса они выглядят так:

1 2 3 4 5 6 7 [next]

Разные сайты обрабатывают страницы по-разному, некоторые дают ссылку для перехода к началу / концу, но на вашем вы говорите, что это выглядит так после первых 7 страниц:

1 2 3 ... 7 8 9 10 [next]

Теперь, в какой-то момент вы дойдете до конца, это будет выглядеть так:

1 2 3 ... 20 21 22 23

Обратите внимание, что нет [следующей] ссылки.

Так что забудьте о генераторах и диапазонах, отслеживайте промежуточные диапазоны и т. Д. Просто сделайте это:

  1. используйте красивый суп для идентификации # ссылок на странице на данной странице вместе со следующей кнопкой.
  2. Каждый раз, когда вы видите [следующую] ссылку, переходите по ней и обрабатывайте красивый суп
  3. Когда вы переходите на страницу, на которой нет следующей ссылки, ссылка на последнюю # страницу является общим числом страниц.
1 голос
/ 03 мая 2009

Мне нравится решение Джона на основе while, но для использования for вы можете сделать что-то вроде:

pages = range(1, num_pages+1)
for p in pages:
   ...possibly pages.extend(range(something, something)) here...

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...