#python #html #web-scraping #beautifulsoup
#python #HTML #веб-очистка #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
Я просто предоставил остальную часть кода, чтобы показать, что .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 вечера исчезли, когда я запускаю скрипт.
Комментарии:
1. если это заполняется javascript, вы не сможете получить его с помощью
BeautifulSoup
.
Ответ №1:
Сайт динамический, поэтому вам необходимо использовать 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
документацию здесь.
Комментарии:
1. Потрясающе, спасибо! Я об этом не подумал. Я очень новичок в этом, и это моя первая попытка.
2. @zezima Рад помочь!
3. @Reedinationer Спасибо, я добавил ссылку на сообщение.
4. Сладко. Однако это не официальная документация, но она не сбила меня с толку, и мне легче ориентироваться, чем по вашей ссылке
5. Сработало отлично! У меня был цикл для очистки 61 страницы, поэтому я заметил, что время выполнения увеличилось совсем немного. Не уверен, было ли это связано с моей собственной ошибкой.
Ответ №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.
Я рекомендую открыть inspect и перейти на вкладку network. Вы можете увидеть, как происходят всевозможные интересные вещи. Вы можете видеть все запросы, которые происходят на сайте.
Ответ №3:
Вы можете легко извлечь значение из атрибута на странице с запросами
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)
Комментарии:
1. Спасибо!! После запуска моего скрипта прошлой ночью я понял, что selenium значительно увеличил время выполнения (если я не сделал что-то не так, что, безусловно, возможно). Я очистил 61 страницу, а также понял, что стандартное время будет лучше. Я рад, что научился использовать selenium, однако я думаю, что это то, что я собираюсь сделать. Спасибо, что сэкономили мне время в Google!