在Python中动态改变范围?
假设我正在用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
注意,这里没有[下一页]的链接。
所以,忘掉生成器、范围和跟踪中间范围这些复杂的东西吧。只需要这样做:
- 使用Beautiful Soup来识别当前页面上的页码链接,以及[下一页]按钮。
- 每次看到[下一页]链接时,点击它并用Beautiful Soup重新解析页面。
- 当你到达一个没有[下一页]链接的页面时,最后的页码链接就是总页数。
6
你可能可以创建一个生成器,它有可变的状态来决定什么时候结束……但是有没有什么简单的办法呢,比如这样?
page = 1
while page < num_pages + 1:
# do stuff that possibly updates num_pages here
page += 1