Как извлечь значение из тега span - PullRequest
5 голосов
/ 10 апреля 2019

Я пишу простой веб-скребок, чтобы извлечь время игры для баскетбольных игр 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

Я только что предоставил остальную часть кода, чтобы показать, что .text на других тегах span работает. Время - единственные данные, которые я действительно хочу. Я просто получаю пустую строку с тем, как мой код в настоящее время.

Это вывод кода, который я получаю при вызове 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 ]

3 голосов
/ 10 апреля 2019

Сайт динамический, поэтому необходимо использовать 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 документацию здесь .

2 голосов
/ 10 апреля 2019

Альтернативой может быть использование некоторых конечных точек ESPN.Эти конечные точки будут возвращать ответы JSON.https://site.api.espn.com/apis/site/v2/sports/basketball/mens-college-basketball/scoreboard

Вы можете увидеть другие конечные точки на этой ссылке GitHub https://gist.github.com/akeaswaran/b48b02f1c94f873c6655e7129910fc3b

Это сделает ваше приложение довольно легким по сравнению с запущенным Selenium.

Я рекомендую открытьосмотреть и зайти на вкладку сети.Вы можете увидеть все виды интересных вещей.Вы можете видеть все запросы, которые происходят на сайте.

1 голос
/ 10 апреля 2019

Вы можете легко получить атрибут на странице с запросами

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...