【问题标题】:Python beautiful soup4- find_all returns "[]"Python漂亮的soup4-find_all返回“[]”
【发布时间】:2017-12-12 12:22:24
【问题描述】:

我正在使用 python BS4 来抓取 https://skinup.gg 网站。我正在尝试从网站按顺序获取乘数类。

我试图通过从 div 历史类中获取所有数据来抓取信息。然而它只返回[],我对如何获得乘数感到困惑。

不知道是不是因为div标签类的值是不断变化的。这引出了我的第二个问题:它们如何在 html 标签中具有动态值?是通过Javascript 完成的吗?

请原谅我的语法错误。

这是我的代码:

import urllib.request
import requests
from bs4 import BeautifulSoup
import urllib

page = requests.g et("https://skinup.gg/"
soup = BeautifulSoup(page.content, "html.parser")


print(soup.find_all('div', attrs={'class': 'win'}))

相关网站代码:

<div class="history"><div class="win" style="">
  <time class="date">23:05</time>
  <span class="multiplier">2.19</span>
</div><div class="win" style="">
  <time class="date">23:04</time>
  <span class="multiplier">2.62</span>
</div><div class="lose" style="">
  <time class="date">23:04</time>
  <span class="multiplier">1.75</span>
</div><div class="lose" style="">
  <time class="date">23:04</time>
  <span class="multiplier">1.00</span>
</div><div class="lose" style="">
  <time class="date">23:04</time>
  <span class="multiplier">1.21</span>
</div><div style="">
  <time class="date">23:03</time>
  <span class="multiplier">1.82</span>
</div><div class="lose" style="">
  <time class="date">23:03</time>
  <span class="multiplier">1.00</span>
</div><div class="win" style="">
  <time class="date">23:03</time>
  <span class="multiplier">2.91</span>
</div><div class="lose" style="">
  <time class="date">23:02</time>
  <span class="multiplier">1.01</span>
</div><div class="win" style="">
  <time class="date">23:02</time>
  <span class="multiplier">1184.44</span>
</div><div class="win" style="">
  <time class="date">23:01</time>
  <span class="multiplier">36.81</span>
</div><div class="lose" style="">
  <time class="date">22:59</time>
  <span class="multiplier">1.38</span>
</div><div class="win" style="">
  <time class="date">22:59</time>
  <span class="multiplier">2.42</span>
</div><div class="win" style="">
  <time class="date">22:59</time>
  <span class="multiplier">8.00</span>
</div><div class="win" style="">
  <time class="date">22:58</time>
  <span class="multiplier">3.42</span>
</div><div class="win" style="">
  <time class="date">22:57</time>
  <span class="multiplier">2.04</span>
</div><div class="lose" style="">
  <time class="date">22:57</time>
  <span class="multiplier">1.17</span>
</div><div class="lose" style="">
  <time class="date">22:57</time>
  <span class="multiplier">1.24</span>
</div><div class="lose" style="">
  <time class="date">22:57</time>
  <span class="multiplier">1.11</span>
</div><div class="lose" style="">
  <time class="date">22:56</time>
  <span class="multiplier">1.53</span>
</div>

                </div>

【问题讨论】:

  • 恐怕你不能使用requestsurllib 来完成这项任务。这是一个js生成的标签。

标签: python web-scraping beautifulsoup


【解决方案1】:

首先,这应该会引发语法错误:

page = requests.g et("https://skinup.gg/"

改成:

page = requests.get("https://skinup.gg/")

我建议使用lxml而不是html.parser,它更快更轻。

现在,回答你的问题,

win为class属性的div段在history类属性的div段下。所以首先你搜索历史,然后在获得的列表中搜索win。

但是,当我运行您的脚本并交叉检查您链接的站点的页面源时,没有具有 win 类属性的 div 段。

您能否提及,您从哪里获得相关网站代码

【讨论】:

  • 我通过打开网页并使用inspector获得了相关代码。感谢之前的建议,我会尝试一下。
【解决方案2】:

对于有问题的网站,您需要使用selenium 来获取您想要的数据。

【讨论】:

  • 对于这个问题,看起来 OP 已经知道 find_all 返回一个列表(因为他说它返回一个空列表)。
  • 在他试图在不迭代的情况下打印它的代码中。
  • 你可以打印一个你知道的列表。还有一个Selenium的例子会很好。
  • 事实上,你是对的,不知道我为什么认为你必须对其进行迭代,可能是因为我默认情况下一直在这样做以访问各个元素。
  • Selenium 可以报废数据吗?我以为它只是自动化网络任务,比如填写表格。
【解决方案3】:

正如 t.m.adam 提到的,urllib 或 requests 无法获取动态页面源。
但是当你看到你用chrome开发者工具链接的页面时,可以看到round.multiplier >2时生成了div win类。
这些是由使用 wss 协议的 'socketcluster/' 接收的。
所以你应该使用 python wss 模块来实现你的目标。

【讨论】:

  • 所以我必须使用不同的库来获取动态网站源代码?当回合乘数大于 2 时,您是如何发现 div win 类更新的?我似乎无法使用 Firefox 的开发工具找到它。谢谢。
  • 你可以从那个站点找到js文件,然后用“history”或“win”搜索一个词。据我所知,您必须使用不同的 liarary,如 web socket 客户端或其他东西来通过 wss 接收动态数据。
猜你喜欢
  • 2019-11-13
  • 1970-01-01
  • 2016-04-30
  • 1970-01-01
  • 1970-01-01
  • 2022-01-11
  • 1970-01-01
  • 1970-01-01
  • 2015-08-27
相关资源
最近更新 更多