在Python中动态更改范围?

时间:2009-05-03 09:59:58

标签: python beautifulsoup

所以说我正在使用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 个答案:

答案 0 :(得分:6)

你可能会创建一个具有可变状态的生成器来确定它什么时候终止......但是像这样简单的事情呢?

page = 1
while page < num_pages + 1:
    # do stuff that possibly updates num_pages here
    page += 1

答案 1 :(得分:2)

这是一个免费的免费答案,但我认为如果你利用美味的汤可以做到这一点很简单:

首先,在第一页上,你有一个页码和&amp;链接;从你的问题他们看起来像这样:

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. 当您点击没有下一个链接的页面时,最后一个#page链接是总页数。

答案 2 :(得分:1)

我喜欢John基于while的解决方案,但要使用for,您可以执行以下操作:

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

也就是说,您必须为要循环的范围指定名称,以便在需要时进行扩展。更改正在迭代的容器通常是不受欢迎的,但在这种特定且高度约束的情况下,它实际上可能是一个有用的习惯用法。