在Python中动态改变范围?

1 投票
3 回答
2711 浏览
提问于 2025-04-15 11:22

假设我正在用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 个回答

1

我喜欢约翰的基于while的解决方案,不过如果你想用for循环的话,可以这样做:

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

也就是说,你需要给你正在循环的范围起个名字,这样在需要的时候可以扩展它。通常来说,改变你正在遍历的容器是不太被推荐的,但在这个特定且限制很大的情况下,这样做其实是个不错的写法。

3

这里有一个不需要代码的答案,但我觉得如果你利用好Beautiful Soup的功能,这个过程会变得简单。

首先,在第一页上,你会看到一些页面号码和链接;根据你的问题,它们看起来像这样:

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. 使用Beautiful Soup来识别当前页面上的页码链接,以及[下一页]按钮。
  2. 每次看到[下一页]链接时,点击它并用Beautiful Soup重新解析页面。
  3. 当你到达一个没有[下一页]链接的页面时,最后的页码链接就是总页数。
6

你可能可以创建一个生成器,它有可变的状态来决定什么时候结束……但是有没有什么简单的办法呢,比如这样?

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

撰写回答