【问题标题】:Parsing website with BeautifulSoup and Requests returns None使用 BeautifulSoup 和 Requests 解析网站返回 None
【发布时间】:2022-01-11 01:45:04
【问题描述】:

我是一起编程的初学者,并且正在处理我的一个项目。为此,我正在尝试解析来自网站的数据以制作使用数据的工具。我发现 BeatifulSoup 和 Requests 是常用的工具,但不幸的是我似乎无法让它工作。它总是返回值 None 或它说的错误:

"TypeError: 'NoneType' 对象不可调用"

我做错了吗?是否可能无法解析某些网站数据并且我被限制访问或其他什么?

如果还有其他方法可以访问我也很高兴听到的数据。

这是我的代码:

from bs4 import BeautifulSoup
import requests

pickrates = {}      # dict to store winrate of champions for each position
source = requests.get("http://u.gg/lol/champions/aatrox/build?role=top").text

soup = BeautifulSoup(source, "lxml")
value = soup.find("div", class_="content-section champion-ranking-stats")
print(value.prettify())

【问题讨论】:

  • 你在哪一行得到了那个错误?请提供完整的错误信息
  • Traceback(最近一次调用最后一次):文件“C:\Users\Mike\Python_Projects\BlindPickGG\riot_api_test.py”,第 9 行,在 print(value.prettify()) AttributeError : 'NoneType' 对象没有属性 'prettify' [在 0.567 秒内完成]
  • 下面的selenium 解决方案有效吗? @MikeWerner

标签: python beautifulsoup python-requests


【解决方案1】:

好像这个问题(can't find html tag when I scrape web using beautifulsoup),问题应该是由JavaScript事件监听器引起的。我建议你使用selenium 来处理这个问题。所以,让selenium在发送请求和取回页面源时使用BeautifulSoup来解析它。

不要忘记从https://www.selenium.dev/documentation/getting_started/installing_browser_drivers/ 下载浏览器驱动程序并将其与您的代码放在同一目录中。

下面的代码示例是在 Firefox 中使用 selenium

from selenium import webdriver
from bs4 import BeautifulSoup

URL = 'http://u.gg/lol/champions/aatrox/build?role=top'
browser = webdriver.Firefox()
browser.get(URL)
soup = BeautifulSoup(browser.page_source, 'html.parser')
time.sleep(1)
browser.close()
value = soup.find("div", class_="content-section champion-ranking-stats")
print(value.prettify())

您的预期输出如下:

>>> print(value.prettify())
<div class="content-section champion-ranking-stats">
 <div class="win-rate meh-tier">
  <div class="value">
   48.4%
  </div>
  <div class="label">
   Win Rate
  </div>
 </div>
 <div class="overall-rank">
  <div class="value">
   49 / 58
  </div>
  <div class="label">
   Rank
  </div>
 </div>
 <div class="pick-rate">
  <div class="value">
   3.6%
  </div>
  <div class="label">
   Pick Rate
  </div>
 </div>
 <div class="ban-rate">
  <div class="value">
   2.3%
  </div>
  <div class="label">
   Ban Rate
  </div>
 </div>
 <div class="matches">
  <div class="value">
   55,432
  </div>
  <div class="label">
   Matches
  </div>
 </div>
</div>

【讨论】:

    【解决方案2】:

    请记住,当您使用 requests 模块请求网页时,您只会获得该页面的 html。我的意思是这个模块不能渲染 JavaScript。

    试试这个代码:

    import requests
    
    source = requests.get("http://u.gg/lol/champions/aatrox/build?role=top").text
    print(source)
    

    然后搜索你手动提供的类名(ctrl + f),根本没有这样的元素。这意味着这些是由其他请求(如 ajax)生成的。它们是在初始 html 页面加载之后创建的。所以在美汤上场之前,你连response对象的.text属性都拿不到。

    一种方法是 Selenium 或任何其他处理 JS 的库。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-05-11
      • 2022-01-10
      • 2017-08-21
      • 1970-01-01
      • 2020-03-13
      • 2021-11-02
      • 2019-10-29
      • 2017-03-08
      相关资源
      最近更新 更多