1

所以说我正在使用 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 页时,分别处理。我正在寻找解决此问题的最佳方法的建议和解决方案。

4

3 回答 3

6

您可能可以创建一个具有可变状态的生成器来确定它何时终止......但是像这样简单的东西呢?

page = 1
while page < num_pages + 1:
    # do stuff that possibly updates num_pages here
    page += 1
于 2009-05-03T10:07:23.553 回答
3

这是一个无代码的答案,但我认为如果你利用美丽的汤让你做的事情很简单:

首先,在第一页上,您有页码和链接;从您的问题来看,它们看起来像这样:

1 2 3 4 5 6 7 [next]

不同的网站处理分页的方式不同,有些网站提供了跳转到开始/结束的链接,但在你的网站上,你说它在前 7 页之后看起来像这样:

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

现在,在某个时候,你会走到尽头,它看起来像这样:

1 2 3 ... 20 21 22 23

请注意,没有 [next] 链接。

所以忘记生成器和范围以及跟踪中间范围等。只需这样做:

  1. 使用漂亮的汤来识别给定页面上的页面 # 链接,以及下一步按钮。
  2. 每次看到 [next] 链接时,请关注它并用美丽的汤重新解析
  3. 当你点击一个没有下一个链接的页面时,最后一个 #page 链接就是总页数。
于 2009-05-03T11:05:47.420 回答
1

我喜欢 John's while-based 解决方案,但要使用 afor您可以执行以下操作:

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

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

于 2009-05-03T19:27:35.140 回答