抓取时如何限制结果数量

Posted

技术标签:

【中文标题】抓取时如何限制结果数量【英文标题】:How to limit the amount of results when scraping 【发布时间】:2019-11-09 01:21:52 【问题描述】:

我正在尝试抓取一个网站及其工作,但我想限制出现的结果数量。我该怎么做?

req = requests.get('https://www.imdb.com/list/ls026573448/')
soup2 = bs4.BeautifulSoup(req.text,)

def pressed(self, instance):
    genre = self.genre.text
    if genre == 'Horror' or 'horror':
        soup2.select('h3')
        for x in soup2.select('h3'):
            print(x.text)

当我运行这段代码时,会出现大约 50 个结果。我如何将其限制为 20 或 15 个?

【问题讨论】:

您要过滤结果吗?如果是,过滤器的标准是什么? 不,我不想过滤任何东西@AndrejKesely,我只想获得前 20 个结果,而不是所有结果 因此,当您的结果在变量 results (即列表)中时,例如对于前 20 个结果,您可以执行 results[:20] for i , tag in enumerate(soup2.select('h3')): if (i > 25): break else: print(tag.text) 【参考方案1】:

这是一个使用 :has 和 :contains 隔离适当元素然后使用limit 在 20 处停止的示例(感谢@facelessuser 指出这一点)。这是bs4 4.7.1。

from bs4 import BeautifulSoup
import requests

r = requests.get('https://www.imdb.com/list/ls026573448/')
soup = bs(r.content, 'lxml')
films = [item.text for item in soup.select('.lister-item-header:has(~ p:has(.genre:contains("Horror"))) a', limit = 20)]
print(films)

【讨论】:

切片可能是浪费循环。相反,您应该输入limitsoup.select('.lister-item-header:has(~ p:has(.genre:contains("Horror"))) a', limit=20)。这样做会导致搜索在达到限制后立即停止,而不是在找到 所有 个匹配项后对其进行过滤。 @facelessuser 太棒了。我不知道那件事。非常感谢。 你ping我?我一定错过了,因为我在收件箱中没有看到任何通知。 @QHarr 嘿,我复制并粘贴了电影变量并将其应用于我自己的代码,但它不起作用,我仍然得到所有结果 完全按照上图运行我的代码。您将获得 20 个结果。

以上是关于抓取时如何限制结果数量的主要内容,如果未能解决你的问题,请参考以下文章

如何限制 Sybase 中返回的结果数量?

ArangoDb - 如何在限制过滤结果之前计算过滤结果的数量

如何对 cloudkit 中给出的结果数量设置限制

使用 ngRepeat 时限制显示结果的数量

如何限制显示的对象数量?

限制查找结果的数量,头部不起作用[重复]