Мой веб-браузер возвращает пустой список, когда я использую правильный селектор CSS - PullRequest
0 голосов
/ 29 мая 2019

Я пытаюсь очистить некоторые данные этого конкретного URL с помощью селена или скрапа.

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

В частности, я ищу информацию о всех моделях телефонов на 'https://shop.freedommobile.ca/devices'.. Я печатаю список только для того, чтобы узнать, что с сайта ничего не было соскоблено или, скорее, очистка прошла успешно, но ничего не было возвращено..

То же самое происходит, когда я пытаюсь что-то здесь тоже почистить:

https://shop.freedommobile.ca/devices/Apple/iPhone_XS_Max?sku=190198786074&planSku=Freedom%20Big%20Gig%20%2B%20Talk%2015GB

from selenium import webdriver

#open chrome browser and navigate to the webpage
driver = webdriver.Chrome()
driver.get("https://shop.freedommobile.ca/devices")

#extract the names of the phones
phones = driver.find_elements_by_css_selector('.jXeFbj')

#counts phone and its model
for element in range(len(phones)):
    numPhone = int(element) + 1
    print("phone "+ str(numPhone) +" : " + phones[element].text)


#number of phones in total
sizeOfList = len(phones)
print(sizeOfList)

То, что должно произойти, это вытащить все названия моделейтелефоны в список.

phones = ['iPhone XS Max', 'iPhone XS', 'iPhone XR', ...]

Ответы [ 2 ]

1 голос
/ 29 мая 2019

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

Вы можете решить эту проблему, используя WebDriverWait.

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

from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
driver = webdriver.Chrome()
driver.get("https://shop.freedommobile.ca/devices")

# get the list of phones
wait = WebDriverWait(driver, 10)
phones = wait.until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, '.jXeFbj')))
numPhones = len(phones)

#prints the formatted output of each phone
for idx, phone in enumerate(phones):
    phone_name = phone.text
    print("phone " + str(idx) + " : " + phone_name)

print(numPhones)

Выход 1:

phone 0 : iPhone XS Max
phone 1 : iPhone XS
phone 2 : iPhone XR
phone 3 : iPhone 8 Plus
phone 4 : iPhone 8
phone 5 : Galaxy S10+
...

Выход 2:

27
0 голосов
/ 29 мая 2019

Чтобы собрать все названия моделей телефонов в список в виде ['iPhone XS Max', 'iPhone XS', 'iPhone XR', ...] с помощью Селен Вы должны вызвать WebDriverWait для visibility_of_all_elements_located(), и вы можете использовать любую из следующих Стратегий локатора :

  • Кодовый блок:

    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
    
    options = webdriver.ChromeOptions() 
    options.add_argument("start-maximized")
    # options.add_argument('disable-infobars')
    driver = webdriver.Chrome(chrome_options=options, executable_path=r'C:\WebDrivers\chromedriver.exe')
    driver.get("https://shop.freedommobile.ca/devices")
    #using CSS_SELECTOR
    print([my_elem.get_attribute("innerHTML") for my_elem in WebDriverWait(driver, 20).until(EC.visibility_of_all_elements_located((By.CSS_SELECTOR, "h3[class^='deviceListItem__DeviceModel-']")))])
    #using XPATH
    #print([my_elem.get_attribute("innerHTML") for my_elem in WebDriverWait(driver, 20).until(EC.visibility_of_all_elements_located((By.XPATH, "//h3[starts-with(@class, 'deviceListItem__DeviceModel-')]")))])
    
  • Консольный вывод:

    ['iPhone XS Max', 'iPhone XS', 'iPhone XR', 'iPhone 8 Plus', 'iPhone 8', 'Galaxy S10+', 'Galaxy S10', 'Galaxy S10e', 'Galaxy Tab A 8 LTE', 'Galaxy Note9', 'Galaxy S9', 'Galaxy A8', 'G7 Power', 'Moto E5 Play', 'Pixel 3a', 'Pixel 3', 'Pixel 3 XL', 'Z557', 'G7 ThinQ', 'P30 lite', 'Mate 20 Pro', 'X Power 3', 'G8 ThinQ', 'Q Stylo +', 'GoFLIP', 'Bring Your', 'Own Device']
    
...