#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)