Я пытаюсь собрать списки футбольной команды колледжа в файл Excel и мне нужна помощь в организации данных. - PullRequest
1 голос
/ 12 октября 2019

Я пытаюсь создать программу, использующую Python, чтобы собрать футбольные списки NCAA в файл Excel, но я не могу понять, как организовать данные так, как я хочу.

В настоящее время я могу собрать весь текст всех игроков, которые мне нужны, имена, рост и вес, родной город и т. Д., Но все это получается одним большим скоплением. Я хотел бы, чтобы имена были в одной колонке, высоты и веса в другой, и так далее, и тому подобное. Я просто не могу найти какую-либо информацию о том, как это сделать, когда ее нет в таблице.


from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.select import Select
from tkinter import *

window = Tk()
window.title("Roster Scraper v1.0")
window.configure(background="light grey")
window.geometry('300x250')

TeamRoster = Label(window, text="Roster URL: ", font=("Arial"), fg="gray17")
TeamRoster.grid(column=0, row=0, sticky='e')
TeamRoster.configure(background="light grey")
URLEntry = Entry(window, width=20)
URLEntry.configure(background="light grey")
URLEntry.grid(column=1, row=0)

def ScrapeScript():

    DesiredRoster = (URLEntry.get())

    driver = webdriver.Firefox()

    driver.get(DesiredRoster)

    PlayerCard = driver.find_element_by_class_name('sidearm-roster-players').text
    print(PlayerCard)


SearchButton = Button(window, text="Scrape", command=ScrapeScript)
SearchButton.grid(column=1, row=3)
SearchButton.configure(background = "light grey")

window.mainloop()

Веб-сайт, с которого я пытаюсь почерпнуть, взят с веб-сайта команды Алабамы: https://rolltide.com/roster.aspx?roster=226&path=football

Многие команды колледжей используют именно этот стиль веб-сайта, поэтому было бы очень полезно не вводить все эти данные вручную. Любая помощь будет принята с благодарностью.

1 Ответ

2 голосов
/ 12 октября 2019

Вы должны создать более сложные правила для очистки только частей данных в строках.

Сначала вы можете использовать find_elements_by_class_names в слове elements), чтобы получить все элементы с классом sidearm-roster-players-name и отдельно с классом sidearm-roster-player-position, sidearm-roster-player-class-hometown и т. д.

all_names = driver.find_elements_by_class_name('sidearm-roster-player-name')
all_pozitions = driver.find_elements_by_class_name('sidearm-roster-player-position')
all_hometowns = driver.find_elements_by_class_name('sidearm-roster-player-class-hometown')

, а затем вы можете использовать zip() для создания пар (name, size, hometown, etc.)

for name, position, hometown in zip(all_names, all_positions, all_hometowns):
    print(name.text, "|", position.text, "|", hometown.text)

from selenium import webdriver

url = 'https://rolltide.com/roster.aspx?roster=226&path=football'

driver = webdriver.Firefox()
driver.get(url)

all_names = driver.find_elements_by_class_name('sidearm-roster-player-name')
all_positions = driver.find_elements_by_class_name('sidearm-roster-player-position')
all_hometowns = driver.find_elements_by_class_name('sidearm-roster-player-class-hometown')

for name, position, hometown in zip(all_names, all_positions, all_hometowns):
    print(name.text, "|", position.text, "|", hometown.text)

Для более подробного анализа вы можете использовать более сложные правила и xpath (find_elements_by_xpath).

Вы даже можете сначала очистить все строки, а затем использовать for -loop для отдельной очистки элементов в каждом ряду.


from selenium import webdriver
import csv

url = 'https://rolltide.com/roster.aspx?roster=226&path=football'

driver = webdriver.Firefox()
driver.get(url)

all_rows = driver.find_elements_by_xpath('//ul[@class="sidearm-roster-players"]//li')

fh = open('output.csv', 'w')
csvwriter = csv.writer(fh)
#write headers
csvwriter.writerow(["Number", "Name", "Position", "Height", "Weight", "Hometown", "Highschool", "Academic year"])

for row in all_rows: #[:10]:
    number = row.find_element_by_xpath('.//div[@class="sidearm-roster-player-name"]//span').text
    print('number:', number)

    name = row.find_element_by_xpath('.//div[@class="sidearm-roster-player-name"]//p').text
    #print('name:', name)

    position = row.find_element_by_xpath('.//div[@class="sidearm-roster-player-position"]/span').text
    #print('position:', position)

    height = row.find_element_by_class_name('sidearm-roster-player-height').text
    #print('height:', height)

    weight = row.find_element_by_class_name('sidearm-roster-player-weight').text
    #print('weight:', weight)

    # it seems some classes have two elements in row - first probably always is empty but I join all elements 

    hometown = row.find_elements_by_class_name('sidearm-roster-player-hometown')
    hometown = ''.join(x.text for x in hometown)
    #print('hometown:', hometown)

    highschool = row.find_elements_by_class_name('sidearm-roster-player-highschool')
    highschool = ''.join(x.text for x in highschool)
    #print('highschool:', highschool)

    academic_year = row.find_elements_by_class_name('sidearm-roster-player-academic-year')
    academic_year = ''.join(x.text for x in academic_year)
    #print('academic_year:', academic_year)

    #print('---')
    csvwriter.writerow([number, name, position, height, weight, hometown, highschool, academic_year])

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