【问题标题】:Python Beautifulsoup (bs4) findAll not finding all elementsPython Beautifulsoup(bs4)findAll没有找到所有元素
【发布时间】:2019-03-21 05:49:09
【问题描述】:

从代码中的 url,我最终试图从页面中收集所有玩家的名字。但是,当我使用 .findAll 来获取所有列表元素时,我还没有成功。请指教。

from urllib.request import urlopen as uReq
from bs4 import BeautifulSoup as soup

players_url = 'https://stats.nba.com/players/list/?Historic=Y'

# Opening up the Connection and grabbing the page
uClient = uReq(players_url)
page_html = uClient.read()

players_soup = soup(page_html, "html.parser")

# Taking all of the elements from the unordered lists that contains all of the players.

list_elements = players_soup.findAll('li', {'class': 'players-list__name'})

【问题讨论】:

  • 找不到什么?
  • 页面中生成的玩家列表是用javascript完成的。您需要一个可以完全呈现​​页面的客户端。通常一种常见的方法是驱动浏览器访问 url(您可以为此使用 selenium),获取页面源然后将其提供给漂亮的汤。

标签: python web-scraping beautifulsoup


【解决方案1】:

正如@Oluwafemi Sule 建议的那样,最好将seleniumBS 一起使用:

from bs4 import BeautifulSoup
from selenium import webdriver

driver = webdriver.Firefox()
driver.get('https://stats.nba.com/players/list/?Historic=Y')
soup = BeautifulSoup(driver.page_source, 'lxml')
for div in soup.findAll('li', {'class': 'players-list__name'}):
    print(div.find('a').contents[0])

输出:

Abdelnaby, Alaa
Abdul-Aziz, Zaid
Abdul-Jabbar, Kareem
Abdul-Rauf, Mahmoud
Abdul-Wahad, Tariq

等等

【讨论】:

    【解决方案2】:

    您可以通过直接从提供名称的 js 脚本中提取请求来单独执行此操作。

    import requests
    import json
    
    r = requests.get('https://stats.nba.com/js/data/ptsd/stats_ptsd.js')
    s = r.text.replace('var stats_ptsd = ','').replace('};','}')
    data = json.loads(s)['data']['players']
    players = [item[1] for item in data]
    print(players)
    

    【讨论】:

      【解决方案3】:

      正如@Oluwafemi Sule 建议的那样)评论中提到:

      页面中生成的玩家列表是用javascript完成的。​​

      我推荐你这个包requests-html 由非常受欢迎的requests 的作者创建,而不是使用 Selenium。它在底层使用 Chromium 来呈现 JavaScript 内容。

      from requests_html import HTMLSession
      
      session = HTMLSession()
      r = session.get('https://stats.nba.com/players/list/?Historic=Y')
      r.html.render()
      for anchor in r.html.find('.players-list__name > a'):
          print(anchor.text)
      

      输出:

      Abdelnaby, Alaa
      Abdul-Aziz, Zaid
      Abdul-Jabbar, Kareem
      Abdul-Rauf, Mahmoud
      Abdul-Wahad, Tariq
      ...
      

      【讨论】:

        猜你喜欢
        • 2019-02-26
        • 1970-01-01
        • 2015-03-24
        • 1970-01-01
        • 2017-01-20
        • 2016-05-27
        • 1970-01-01
        • 1970-01-01
        • 2018-03-28
        相关资源
        最近更新 更多