Нажмите кнопку, а затем очистите данные на казалось бы статической веб-странице?

Я пытаюсь очистить статистику игрока в Totals Таблица по этой ссылке: http://www.basketball-reference.com/players/j/jordami01.html. Когда вы впервые появляетесь на этом сайте, гораздо сложнее обработать данные как есть, поэтому у вас есть возможность нажать "CSV" прямо над таблицей. Этот формат будет намного легче переварить.

У меня проблемы

import urllib2
from bs4 import BeautifulSoup
from selenium import webdriver

player_link = "http://www.basketball-reference.com/players/j/jordami01.html"

browser = webdriver.Firefox()
browser.get(player_link)
elem = browser.find_element_by_xpath("//span[@class='tooltip' and @onlick='table2csv('totals')']")
elem.click()

Когда я запускаю это, появляется окно Firefox, но код никогда не меняет таблицу с ее исходного формата на CSV. Таблица CSV появляется в исходном коде только после того, как я щелкну CSV (очевидно). Как я могу получить selenium нажать на эту кнопку CSV, а затем BS, чтобы очистить данные?

1 ответ

Решение

Вам не нужно BeautifulSoup здесь Нажмите на CSV Кнопка с селеном, извлечь содержимое появившегося pre элемент с данными CSV и анализировать его со встроенным csv модуль:

import csv
from StringIO import StringIO

from selenium import webdriver
from selenium.common.exceptions import TimeoutException
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

player_link = "http://www.basketball-reference.com/players/j/jordami01.html"

browser = webdriver.Firefox()
wait = WebDriverWait(browser, 10)
browser.set_page_load_timeout(10)

# stop load after a timeout
try:
    browser.get(player_link)
except TimeoutException:
    browser.execute_script("window.stop();")

# click "CSV"
elem = wait.until(EC.presence_of_element_located((By.XPATH,  "//div[@class='table_heading']//span[. = 'CSV']")))
elem.click()

# get CSV data
csv_data = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, "pre#csv_totals"))).text.encode("utf-8")
browser.close()

# read CSV
reader = csv.reader(StringIO(csv_data))
for line in reader:
    print(line)
Другие вопросы по тегам