【问题标题】:Printing contents from class using BeautifulSoup使用 BeautifulSoup 打印课堂内容
【发布时间】:2021-10-29 19:11:30
【问题描述】:

我想打印类内的文本。

这是 HTML 片段(它在许多类中,但在视觉上,它在 Prestige 旁边->

<div class="sc-ikPAkQ ceimHt">
   9882
</div>

这是我的代码->

from bs4 import BeautifulSoup
import requests

URL = "https://auntm.ai/champions/abomination/tier/6"
page = requests.get(URL)

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

for data in soup.findAll('div', attrs={"class": "sc-ikPAkQ ceimHt"}):
    print(data)

我想打印类中的整数 9882 我试过但我失败了。 我该怎么做?

【问题讨论】:

  • 使用硒刮

标签: python python-3.x beautifulsoup python-requests


【解决方案1】:

与典型的静态网页不同,网页的主要内容是通过 JavaScript 动态加载的。

也就是说,响应正文 (page.content) 不会包含您最终看到的所有内容。相反,当您通过 Web 浏览器访问网页时,浏览器会执行这些 JavaScript 代码,然后使用来自其他数据源的数据(通常通过另一个 API 调用或脚本本身中的一些硬编码数据)更新 HTML。换句话说,在 Web 浏览器的 DOM 检查器中显示的最终 HTML 与您使用 requests.get 获得的不同。 (您可以通过打印page.content 或单击页面右键菜单中的“查看页面源代码”条目来验证这一点。

处理这种情况的一般方法是:

  1. 向 selenium 寻求帮助。 Selenium 本质上是一个程序控制的 Web 浏览器(但没有真正的窗口),供 JS 代码正常执行和呈现网页。
  2. 检查该页面上的 JS 代码和/或其他网络请求以提取数据源。它需要一些 Web 开发或 JS 方面的经验和知识。

【讨论】:

  • 哦,好的,感谢您的帮助
【解决方案2】:

您可以通过调用.get("text") 获取文本,即

for data in soup.findAll('div', attrs={"class": "sc-ikPAkQ ceimHt"}):
    data.get("text")

检查getText() vs text() vs get_text() 了解获取文本的不同方式(以及Get text of children in a div with beautifulsoup 以回答您的问题)

【讨论】:

  • 它没有用。你确定文本会用冒号吗?
  • 你也可以直接打电话给data.text(但也一样)。检查此stackoverflow.com/questions/20889790/…stackoverflow.com/questions/52093875/… SO 帖子。如果它不起作用,请确保您正确调用它,即如果返回列表等,您可能还需要循环 data
  • 我正在这样做 - for data in soup.findAll('div', {"class": "sc-ikPAkQ ceimHt"}): print(data.text)
  • 我刚试过 - 你的 findAll 返回一个空列表:div = soup.findAll('div', attrs={"class": "sc-ikPAkQ ceimHt"}) #returns []
  • 是的,我也是。我知道为什么。在 html 中它包含文本
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-24
  • 2016-03-12
  • 1970-01-01
  • 2015-08-30
  • 2015-01-12
  • 2017-04-03
相关资源
最近更新 更多