我正在编写一个简单的网络刮刀来提取ncaa篮球比赛的游戏时间。代码不需要漂亮,只需要工作。我从同一页面上的其他span标签中提取了值,但由于某种原因我无法使用这个标签。
from bs4 import BeautifulSoup as soup
import requests
url = 'http://www.espn.com/mens-college-basketball/game/_/id/401123420'
response = requests.get(url)
soupy = soup(response.content, 'html.parser')
containers = soupy.findAll("div",{"class" : "team-container"})
for container in containers:
spans = container.findAll("span")
divs = container.find("div",{"class": "record"})
ranks = spans[0].text
team_name = spans[1].text
team_mascot = spans[2].text
team_abbr = spans[3].text
team_record = divs.text
time_container = soupy.find("span", {"class":"time game-time"})
game_times = time_container.text
refs_container = soupy.find("div", {"class" : "game-info-note__container"})
refs = refs_container.text
print(ranks)
print(team_name)
print(team_mascot)
print(team_abbr)
print(team_record)
print(game_times)
print(refs)
我关注的具体代码是这个,
time_container = soupy.find("span", {"class":"time game-time"})
game_times = time_container.text
我刚刚提供了其余代码,以显示其他span标记上的.text是有效的。时间是我真正想要的唯一数据。我只是得到一个空字符串,其中包含我当前的代码。
这是我调用time_container时获得的代码的输出
<span class="time game-time" data-dateformat="time1" data-showtimezone="true"></span>
或者只是''当我做game_times。
以下是网站上的HTML行:
<span class="time game-time" data-dateformat="time1" data-showtimezone="true">6:10 PM CT</span>
我不明白为什么当我运行脚本时,下午6点10分消失了。
该网站是动态的,因此,您需要使用selenium
:
from selenium import webdriver
d = webdriver.Chrome('/path/to/chromedriver')
d.get('http://www.espn.com/mens-college-basketball/game/_/id/401123420')
game_time = soup(d.page_source, 'html.parser').find('span', {'class':'time game-time'}).text
输出:
'7:10 PM ET'
查看完整的selenium
文档here。
另一种方法是使用ESPN的一些端点。这些端点将返回JSON响应。 https://site.api.espn.com/apis/site/v2/sports/basketball/mens-college-basketball/scoreboard
你可以在这个GitHub链接https://gist.github.com/akeaswaran/b48b02f1c94f873c6655e7129910fc3b上看到其他端点
与运行Selenium相比,这将使您的应用程序非常轻量级。
我建议打开检查并转到网络选项卡。你可以看到各种各样的酷事。您可以看到网站中发生的所有请求。
您可以轻松地从页面上的属性中获取请求
import requests
from bs4 import BeautifulSoup as bs
from dateutil.parser import parse
r = requests.get('http://www.espn.com/mens-college-basketball/game/_/id/401123420')
soup = bs(r.content, 'lxml')
timing = soup.select_one('[data-date]')['data-date']
print(timing)
match_time = parse(timing).time()
print(match_time)