如何从span标签提取值

时间:2019-04-09 22:45:54

标签: python html web-scraping beautifulsoup

我正在编写一个简单的网络抓取工具,以提取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消失了。

3 个答案:

答案 0 :(得分:3)

网站是动态的,因此,您需要使用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

答案 1 :(得分:2)

一种替代方法是使用某些ESPN端点。这些端点将返回JSON响应。 https://site.api.espn.com/apis/site/v2/sports/basketball/mens-college-basketball/scoreboard

您可以在此GitHub链接https://gist.github.com/akeaswaran/b48b02f1c94f873c6655e7129910fc3b

上看到其他端点

与运行Selenium相比,这将使您的应用程序轻巧。

我建议打开检查并转到“网络”选项卡。您可以看到各种有趣的事情正在发生。您可以看到站点中正在发生的所有请求。

答案 2 :(得分:1)

您可以轻松地从页面上的属性中获取请求

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)

enter image description here

enter image description here