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
。玩得开心! :)
这里是 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
您可能需要查看
编辑:已更新以指定 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
。玩得开心! :)