抓取时如何限制结果数量
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)
【讨论】:
切片可能是浪费循环。相反,您应该输入limit
:soup.select('.lister-item-header:has(~ p:has(.genre:contains("Horror"))) a', limit=20)
。这样做会导致搜索在达到限制后立即停止,而不是在找到 所有 个匹配项后对其进行过滤。
@facelessuser 太棒了。我不知道那件事。非常感谢。
你ping我?我一定错过了,因为我在收件箱中没有看到任何通知。
@QHarr 嘿,我复制并粘贴了电影变量并将其应用于我自己的代码,但它不起作用,我仍然得到所有结果
完全按照上图运行我的代码。您将获得 20 个结果。以上是关于抓取时如何限制结果数量的主要内容,如果未能解决你的问题,请参考以下文章