Использование if l oop для исключения записей, содержащих подстроку - PullRequest
0 голосов
/ 03 апреля 2020

Я пытаюсь собрать результаты и статистику за последние 4 сезона снукера из https://cuetracker.net.

Мне удалось (в некоторой степени) собрать большую часть данных, однако я забыли признать, что есть прогулочные Эти обходы содержат только данные о национальности, имени игрока и счете, а не статистику, и поэтому, поскольку я собрал данные в списки, они не корректно выравниваются при преобразовании их в DataFrame.

Я пытаюсь использовать if в заявлении в моем l oop, чтобы попытаться пропустить эти совпадения, которые являются прогулками и, следовательно, выровнять правильные характеристики с правильным соответствием. Я пытаюсь использовать слово «Walkover», чтобы остановить добавление элемента в мой список.


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
from selenium.webdriver.support.select import Select
from bs4 import BeautifulSoup

import os
import re
import time
import pandas as pd


def wait_for_page_load():
    timer = 15
    start_time = time.time()
    page_state = None
    while page_state != 'complete':
        time.sleep(0.5)
        page_state = browser.execute_script('return document.readyState;')
        if time.time() - start_time > timer:
            raise Exception('Timeout :(')


chrome_path = r"C:\Users\George\Desktop\chromedriver.exe"
browser = webdriver.Chrome(chrome_path)
page_source = browser.page_source

browser.get("https://cuetracker.net/seasons")
links = browser.find_elements_by_css_selector("table.table.table-striped a")
hrefs=[]
for link in links:
    hrefs.append(link.get_attribute("href"))

hrefs = hrefs[1:2]

hrefs2 = []

for href in hrefs:
    browser.get(href)
    wait_for_page_load()
    links2 = browser.find_elements_by_xpath('.//tr/td[2]/a')
    for link in links2:
        hrefs2.append((link.get_attribute("href")))

player_1_nationality = []
player_1_name = []
player_1_score = []
player_2_score = []
player_2_nationality = []
player_2_name = []
date_played = []
player_1_points_scored = []
player_2_points_scored = []
player_1_fifty_plus_breaks = []
player_2_fifty_plus_breaks = []
match_progress = []
player_1_points_per_frame = []
player_2_points_per_frame = []


for href in hrefs2:
    browser.get(href)
    wait_for_page_load()
    list_1_nationality= browser.find_elements_by_xpath('.//div/div[2]/div[1]/b/img')
    for lis in list_1_nationality:
        player_1_nationality.append(lis.get_attribute("alt"))
    list_1_player = browser.find_elements_by_xpath('.//div/div[2]/div[1]/b/a')
    for li in list_1_player:
        player_1_name.append(li.get_attribute('text'))
    list_2_nationality = browser.find_elements_by_xpath('.//div/div[2]/div[3]/img')
    for nationality_2 in list_2_nationality:
        player_2_nationality.append(nationality_2.get_attribute("alt"))
    list_2_name = browser.find_elements_by_xpath('.//div/div[2]/div[3]/a')
    for name_2 in list_2_name:
        player_2_name.append(name_2.get_attribute('text'))
    list_1_score = browser.find_elements_by_xpath('.//div/div[2]/div[2]/span[1]/b')
    for score in list_1_score:
        player_1_score.append(score.get_attribute('innerText'))
    list_2_score = browser.find_elements_by_xpath('.//div/div[2]/div[2]/span[3]')    
    for score_2 in list_2_score:
        player_2_score.append(score_2.get_attribute('innerText'))
    #list_date_played = browser.find_elements_by_xpath('.//div[4]/div[2]/div/div') 
    #for date in list_date_played:
        #date_played.append(date.get_attribute('innerText'))
    page_source = browser.page_source
    soup = BeautifulSoup(page_source, 'lxml')
    points_scored_elem = soup.find_all('div', text='Points Scored') 
    for elem in points_scored_elem:
        player_1_points_scored.append(elem.find_next('div').find_next('div').find_next('div').get_text())
    points_scored_2_elem = soup.find_all('div', text='Points Scored') 
    for elem in points_scored_2_elem:
        player_2_points_scored.append(elem.find_next('div').find_next('div').find_next('div').find_next('div').get_text())
    fifty_plus_breaks_elem = soup.find_all('div', text='50+ Breaks') 
    for elem in fifty_plus_breaks_elem:
        player_1_fifty_plus_breaks.append(elem.find_next('div').find_next('div').find_next('div').get_text())
    fifty_plus_breaks_2_elem = soup.find_all('div', text='50+ Breaks') 
    for elem in fifty_plus_breaks_2_elem:
        player_2_fifty_plus_breaks.append(elem.find_next('div').find_next('div').find_next('div').find_next('div').get_text())
    match_progress_elem = soup.find_all('div', text='Match progress') 
    for elem in match_progress_elem:
        match_progress.append(elem.find_next('div').find_next('div').find_next('div').get_text(strip=True))
    points_per_frame_elem = soup.find_all('div', text='points/frame') 
    for elem in points_scored_elem:
        player_1_points_per_frame.append(elem.find_next('div').find_next('div').find_next('div').get_text())
    points_per_frame_2_elem = soup.find_all('div', text='Avg. points/frame') 
    for elem in points_scored_elem:
        player_2_points_per_frame.append(elem.find_next('div').find_next('div').find_next('div').find_next('div').get_text())
    points_scored_2_elem = soup.find_all('div', text='Avg. points/frame') 
    for elem in points_scored_2_elem:
        player_2_points_per_frame.append(elem.find_next('div').find_next('div').find_next('div').find_next('div').get_text())
    list_date_played = soup.find_all('div', text='Played on') 
    for date in list_date_played:
        date_played.append(date.find_next('div').find_next('div').find_next('div').get_text(strip=True))

Приведенный выше код является основной частью моего кода очистки. Ниже то, что я пытаюсь проверить, чтобы пропустить прогулку. Я пытаюсь использовать родителя img, так как он содержит строку 'Walkover' внутри своего внутреннего текста.

for href in hrefs2:
    browser.get(href)
    wait_for_page_load()
    page_source = browser.page_source
    list_3_nationality = browser.find_elements_by_xpath('.//div/div[2]/div[1]/b/img')
    for lis in list_1_nationality:
        check = lis.find_element_by_xpath(("./parent::b"))
        check = check.get_attribute('innerText')
        if 'Walkover' in check:
            continue
        else:
            player_1_nationality.append(lis.get_attribute('alt'))

По какой-то причине это не работает?

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