Удаление веб-страницы с веб-сайта, созданного с помощью React и jQuery

#python #selenium #selenium-webdriver #beautifulsoup #scrapy

Вопрос:

Мне нужно извлечь название продукта, цену и цвет по умолчанию из следующей ссылки: <a rel=»noreferrer noopener nofollow» href=»https:///» rel=»nofollow noreferrer»>Ссылка

Однако каждый раз, когда я загружаю приведенный ниже сценарий, информация извлекается по-разному (иногда печатаются все три значения, иногда 1-2 из них или ни одного). Это происходит независимо от WebDriverWait.

 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
from selenium.webdriver.common.action_chains import ActionChains as AC
#import json
from bs4 import BeautifulSoup as soup
browser = webdriver.Firefox()
browser.get('https://shop.mango.com/gb/women/skirts-midi/midi-satin-skirt_17042020.html?c=99')

wait = WebDriverWait(browser, 100).until(EC.presence_of_all_elements_located)

s = soup(browser.page_source, 'html.parser')
name = s.select('.product-name')[0].getText()
price = s.select('.product-sale')[0].getText()
color = s.select('.colors-info')[0].getText()
print(name, price, color)
 

Не могли бы вы посоветовать, как извлечь все три элемента? Если я попытаюсь загрузить страницу с запросами или скрапом, вышеуказанные элементы отсутствуют.

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

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

2. @cruisepandey то же самое было с селеном: « браузере.вам(‘ shop.mango.com/gb/women/skirts-midi/… ) жду = WebDriverWait(браузер, 100).до(ЕК.presence_of_all_elements_located) имя = браузера.find_element_by_class_name(‘название продукта’).текст цене = браузера.продукт продажи find_element_by_class_name (»).цвет текста = браузера.цвета-инфо find_element_by_class_name (»).продукт текст = {«имя»: имя, «цена»: цена, «цвет»: цвет } с открытым(‘product5.в формате JSON’,’ж’), как product_dumped : в формате JSON.свалка(продукта,product_dumped) «

Ответ №1:

Несколько пунктов :

  1. Там есть кнопка «Принять файлы cookie», которую вы должны нажать, чтобы продолжить.
  2. После кнопки cookies есть модальная кнопка закрытия, которую мы должны нажать, чтобы продолжить.
  3. Используйте явное ожидание, видимость элемента для этого случая.
  4. Предпочитаю CSS больше xpath .
  5. Разверните браузер.

Код :

 driver = webdriver.Chrome(driver_path)
driver.maximize_window()
#driver.implicitly_wait(50)
wait = WebDriverWait(driver, 20)

driver.get('https://shop.mango.com/gb/women/skirts-midi/midi-satin-skirt_17042020.html?c=99')

try:
    print("to accept cookies")
    wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, "button[id='onetrust-accept-btn-handler']"))).click()
except:
    pass

try:
    print("to close modal pop up windows")
    wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, "div[class*='closeModal'][class$='confirmacionPais']"))).click()
except:
    pass


name = wait.until(EC.visibility_of_element_located((By.CLASS_NAME, 'product-name'))).text
price = wait.until(EC.visibility_of_element_located((By.CLASS_NAME, 'product-sale'))).text
color = wait.until(EC.visibility_of_element_located((By.CLASS_NAME, 'colors-info'))).text

print(name, price, color)
 

Импорт :

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

Выход :

 to accept cookies
to close modal pop up windows
Midi satin skirt £39.99 Black
 

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

1. Большое спасибо @cruuisepandey, это отлично работает.