очистка спортивного стола от oddsportal

#python #selenium #web-scraping

#питон #селен #соскабливание полотна #python #selenium #очистка веб-страниц

Вопрос:

Я пытаюсь очистить эту веб-страницуhttps://www.oddsportal.com/moving-margins Но код иногда работает, а иногда нет, и даже если работа не удаляет все данные, которые мне нужны для каждого совпадения.

 u = 'https://www.oddsportal.com/moving-margins/'
driver = webdriver.Chrome(executable_path=r"C:chromedriver.exe")
driver.maximize_window()
driver.get(u)
#Use Explicit time wait for fast execution
WebDriverWait(driver, 30).until(EC.presence_of_element_located((By.CSS_SELECTOR, "#moving_margins_content_overall")))
driver.execute_script("window.scrollTo(0, document.body.scrollHeight)")
table_data =  driver.find_elements_by_xpath("//div[@id='moving_margins_content_overall']//tr[@class='odd' or @class='dark']")
table =[]
# Creating a list of lists, where each list consist all data in each row either with class dark or odd

for data in table_data:
    row = []
    dark_row = data.find_elements_by_xpath((".//th//a"))
    for col in dark_row:
        row.append(col.text.replace("n"," "))
    odd_row = data.find_elements_by_xpath((".//following-sibling::tr[@class='odd']//td"))
    for col in odd_row:
        row.append(col.text.replace("n", " "))
    table.append(row)
  

Моя цель — сохранить данные в CSV-файл с этими столбцами:

 sport    country    competiton    handicap    match_date  match                  hdp_open  hdp_close  bookmaker
Tennis   Czech      Ostrava..     AH 0 Games  Today12:00  Karatsev A. - Otte O.  0.5       -1.5      Nordicbet   

  

Комментарии:

1. «код иногда работает, а иногда нет» не объясняет, в чем проблема, не могли бы вы быть более точным? У вас есть какая-либо ошибка? Что это значит, что это не работает.

2. иногда возвращает ошибку: selenium.common.exceptions. Исключение NoSuchElementException: Сообщение: нет такого элемента: Не удается найти элемент: {«метод»: «xpath»,»селектор»:».//следующий-родной::tr//th[@class=’first2′]»}

3. попробуйте скопировать полный Xpath и запустить код.

4. даже если я изменю xpath, очищенные данные — это не все данные, присутствующие в таблице

Ответ №1:

Я думаю, что проблема в вашем коде заключается в том, что в некоторых случаях на странице есть одна «темная» строка для многих строк «коэффициентов». Итак, когда вы перебираете элементы, вы создаете одну запись для таблицы, в которой на самом деле больше записей.

Этот код должен соответствовать вашим потребностям, но имейте в виду, что он не является оптимальным, поскольку не учитывает возможные исключения, но это отправная точка:

 from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
import selenium.webdriver.support.expected_conditions as EC
from selenium.webdriver.common.by import By

u = 'https://www.oddsportal.com/moving-margins/'
driver = webdriver.Chrome(executable_path=r"chromedriver.exe")
driver.maximize_window()
driver.get(u)
#Use Explicit time wait for fast execution
WebDriverWait(driver, 30).until(EC.presence_of_element_located((By.CSS_SELECTOR, "#moving_margins_content_overall")))
driver.execute_script("window.scrollTo(0, document.body.scrollHeight)")
tables =  driver.find_elements_by_xpath("//div[@id='moving_margins_content_overall']//table")
tableData =[]

for table in tables:
    trDark = table.find_element_by_xpath('.//tr[@class="dark"]')
    trOdds = table.find_elements_by_xpath('.//tr[@class="odd"]')

    row = [trDark.text.strip().replace("n", " ")]
    for odd in trOdds:
        tds = [
            td.text.strip().replace("n", " ") 
            for td in odd.find_elements_by_xpath('.//td')
        ]
        row = row   tds
    tableData.append(row)

print(tableData)