Проблема с очисткой селена

Я создаю веб-скребок, который парсит топ-100 Beatport. У меня возникла проблема: некоторые элементы находятся, но другие получают ошибку.

def scrape_beatport():
    user_agent = UserAgent().random
    chrome_options = Options()
    chrome_options.add_argument(f"user-agent = {user_agent}")
    driver = webdriver.Chrome(options=chrome_options)
    
    try:
        driver.get('https://www.beatport.com/top-100')
        WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.CSS_SELECTOR, 'div#__next')))
        
        test1 = driver.find_elements(By.CSS_SELECTOR, 'div#__next')
        test2 = driver.fin_elements(By.CSS_SELECTOR, 'div.TracksList-style__Wrapper-sc-3fb03d50-8 bWXYsy row')
        

        
    finally:
        driver.quit()


        
if __name__ == '__main__':
    scrape_beatport()    

это мой код. test1 находится в теге body и является элементом div. test2 гораздо глубже проникает в структуру HTML. он находится внутри множества других элементов div, и когда я пытаюсь его получить, они выдают ошибку:

Traceback (most recent call last):
  File "/Users/just/Documents/python/yt_test.py", line 84, in <module>
    scrape_beatport()    
    ^^^^^^^^^^^^^^^^^
  File "/Users/just/Documents/python/yt_test.py", line 71, in scrape_beatport
    WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.CSS_SELECTOR, 'div.__next div.MainLayout-style__MainWrapper-sc-9f30c253-0 div div.MainLayout-style__Main-sc-9f30c253-1 main.MainLayout-style__MainContent-sc-9f30c253-2 div.TracksList-style__Wrapper-sc-3fb03d50-8')))
  File "/Library/Frameworks/Python.framework/Versions/3.11/lib/python3.11/site-packages/selenium/webdriver/support/wait.py", line 105, in until
    raise TimeoutException(message, screen, stacktrace)
selenium.common.exceptions.TimeoutException: Message: 
Stacktrace:
0   chromedriver                        0x0000000105272940 chromedriver + 4368704
1   chromedriver                        0x000000010526add4 chromedriver + 4337108
2   chromedriver                        0x0000000104e8ec04 chromedriver + 289796
3   chromedriver                        0x0000000104ed0e00 chromedriver + 560640
4   chromedriver                        0x0000000104f095ec chromedriver + 792044
5   chromedriver                        0x0000000104ec5ab4 chromedriver + 514740
6   chromedriver                        0x0000000104ec650c chromedriver + 517388
7   chromedriver                        0x0000000105236e5c chromedriver + 4124252
8   chromedriver                        0x000000010523bc4c chromedriver + 4144204
9   chromedriver                        0x000000010521c824 chromedriver + 4016164
10  chromedriver                        0x000000010523c57c chromedriver + 4146556
11  chromedriver                        0x000000010520e2d8 chromedriver + 3957464
12  chromedriver                        0x000000010525bec4 chromedriver + 4275908
13  chromedriver                        0x000000010525c040 chromedriver + 4276288
14  chromedriver                        0x000000010526aa34 chromedriver + 4336180
15  libsystem_pthread.dylib             0x000000018a0bd034 _pthread_start + 136
16  libsystem_pthread.dylib             0x000000018a0b7e3c thread_start + 8

Пожалуйста, проверьте Top 100 Beatport самостоятельно, чтобы увидеть HTML, потому что это очень много.

Большое спасибо!

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
52
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы не можете передать несколько классов, разделенных пробелами, в CSS_SELECTOR, но это возможно с помощью XPATH:

Это должно работать:

test2 = driver.find_elements(By.XPATH, '//div[@class = "TracksList-style__Wrapper-sc-3fb03d50-8 bWXYsy row"]')

Имя класса не содержит пробелов... каждый класс ОТДЕЛЕН ПРОБЕЛАМИ. Это синтаксис селектора CSS.

JeffC 23.05.2024 21:36
Ответ принят как подходящий

В вашем коде истекло время ожидания присутствия элемента, но локатор был неправильным, поэтому он так и не появился.

Я обновил ваш код ниже, и он работает. Вытягивает названия всех треков. Если вы хотите получить дополнительную информацию, обязательно начните поиск с row, например. row.find_element() нет driver.find_element().

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

def scrape_beatport():
    # user_agent = UserAgent().random
    # chrome_options = Options()
    # chrome_options.add_argument(f"user-agent = {user_agent}")
    # driver = webdriver.Chrome(options=chrome_options)
    driver = webdriver.Chrome()

    try:
        driver.get('https://www.beatport.com/top-100')
        wait = WebDriverWait(driver, 10)
        rows = wait.until(EC.visibility_of_all_elements_located((By.CSS_SELECTOR, "div[data-testid='tracks-table-row']")))
        print(len(rows))
        for row in rows:
            title = row.find_element(By.CSS_SELECTOR, "div[data-testid='marquee-parent']").text
            print(title)
    finally:
        driver.quit()

if __name__ == '__main__':
    scrape_beatport()

Выход

100
Waiting For Tonight Extended Mix       
Go Back feat. Julia Church Original Mix
Last Night Anyma x Layton Giordani Extended Remix
It's Not Right But It's Okay Extended
...

Спасибо! Ты удивительный. Последние несколько дней я боролся с этой проблемой и ничего не смог найти. Спасибо!

Just Verhagen 24.05.2024 07:05

Пожалуйста. Рад, что это сработало для вас. Если этот или любой другой ответ был полезен, пожалуйста, проголосуйте за него. Как только вы найдете ответ на свой вопрос, пожалуйста отметьте его как принятый, чтобы вопрос не остался без ответа.

JeffC 24.05.2024 07:30

Другие вопросы по теме