BeautifulSoup ESPN:正在抓取体育比分,但 .findAll 给出了一个空的结果集。如何提取正确的信息?

BeautifulSoup ESPN: Scraping Sports Score but .findAll gives an empty ResultSet. How to pull proper info?

这里是 Python 和 BeautifulSoup 用户。

我想从 ESPN 网站上抓取一些体育比分,但 returns 是空的。

示例目标:ESPN 网站 > NBA > 比分

我想获取一些信息,例如团队名称、分数、记录和 Quarter/Final,但由于遇到问题,我将从分数开始。我想得到球队的总分。

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

html_url = 'http://www.espn.co.uk/nba/scoreboard'

uClient = uReq(html_url)

page_html = uClient.read()

uClient.close()

page_soup = bs(page_html, 'html.parser')

containers = page_soup.findAll('td',{"class":"total"})

print (len(containers))
print (type(containers))

输出

0
<class 'bs4.element.ResultSet'>

我花了一整天的时间试图弄清楚为什么我的所有结果总是返回 NoneType 和空的我似乎无法弄清楚。

我试过只查找 'td',这就是结果

containers = page_soup.findAll('td')

print (len(containers))
print (type(containers))

输出

0
<class 'bs4.element.ResultSet'>

不知道为什么我无法提取数据。 ESPN 故意不允许我们抓取的幕后发生了什么事吗?我试过查看不同的标签、属性等,但无法弄清楚。 谢谢

我相信您遇到的问题是由于网络内容通过 Javascript 动态显示所致。您的处理方式不会让您访问该信息,但您可能想查看 this post 以了解如何使用 Selenium 和 BeautifulSoup 一起解析动态 Web 内容。尝试 运行 下面的代码来获取您在那里搜索的分数:

from bs4 import BeautifulSoup
from selenium import webdriver

driver = webdriver.Firefox()
driver.get("http://www.espn.co.uk/nba/scoreboard")

html = driver.page_source
soup = BeautifulSoup(html, "lxml")

for tag in soup.find_all("td", {"class":"total"}):
    print (tag.text)

这会产生以下输出:

87
99
106
102
123
131

您可能需要查看 以下载 Selenium 并将其添加到您的系统 PATH 以便脚本运行。

编辑:已更新以指定 BeautifulSoup documentation 推荐的 lxml HTML 解析器的速度。

由于浏览器中的 JavaScript 运行,您尝试获取的数据已呈现。我推荐你RequestsHTML.

代码:

from requests_html import HTMLSession

session = HTMLSession()
r = session.get('http://www.espn.co.uk/nba/scoreboard')
r.html.render()

for tag in r.html.find('td.total'):
    print(tag.text)

输出:

106
102
123
131
105
121
102
115

不要忘记安装它:pip install requests-html。玩得开心! :)