【问题标题】:Python : find_all() return an empty listPython:find_all() 返回一个空列表
【发布时间】:2020-07-23 23:05:53
【问题描述】:

我正在尝试制作一个机器人,一旦新产品在网站上上线,就会向我发送电子邮件。

我尝试通过 requestsbeautifulSoup 来做到这一点。

这是我的代码:

import requests
from bs4 import BeautifulSoup

URL = 'https://www.vinted.fr/vetements?search_text=football&size_id[]=207&price_from=0&price_to=15&order=newest_first'

headers = {'User-Agent': "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.89 Safari/537.36"}

page = requests.get(URL, headers=headers)

soup = BeautifulSoup(page.content, 'html.parser')

products = soup.find_all("div", class_="c-box")

print(len(products))

接下来,我要循环比较新请求前后的产品数量。

但是当我尝试查看找到的产品数量时,我得到一个空列表:[]

我不知道如何解决这个问题......

我用的div在别人的div里,不知道有没有关系

提前致谢

【问题讨论】:

  • 我在运行您的脚本时收到 403。所以,soup 对象可能没有解析所需的 dom

标签: python beautifulsoup python-requests


【解决方案1】:

您尝试解析的网站有问题。

在网站完全加载后,您的代码中的网站会在客户端使用 javascript 生成您正在寻找的元素 (div.c-box)。就像这样:

浏览器从服务器获取 HTML 源代码 --(1)--> 浏览器加载 html 源代码时加载的 JS 文件 --> JS 文件向 HTML 源代码添加元素 --(2)--> 这些元素被加载到浏览器

您无法通过requests.get 获取您想要的数据,因为requests.get 方法只能在(1) 点获取HTML 源,但网站会在(2) 点加载数据。要获取此类数据,您应该使用自动浏览器模块,例如 selenium

【讨论】:

  • 谢谢,我要去看看 selenium 的教程!
【解决方案2】:

您应该经常检查数据。

使用soup.decode('utf-8') 将BeautifulSoup 对象转换为字符串并将其写入文件。然后检查您从网站获得的信息。在这种情况下,没有 c-box 类的元素。

您应该使用selenium 而不是requests

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多