В настоящее время используется Python и Selenium для очистки данных, экспорта в CSV и последующей обработки по мере необходимости. Мне сложно понять, как создавать операторы xpath для доступа к определенным текстовым элементам на динамически сгенерированной странице.

https://dutchie.com/embedded-menu/revolutionary-clinics-somerville/menu

На приведенной выше странице я хотел бы экспортировать категорию (не часть каждого продукта, а родительский элемент), за которой следуют все текстовые поля, связанные с карточкой продукта.

Следующее утверждение позволяет мне вытащить все заголовки (вроде) из категории «Цветок», но из-за этого я не могу получить доступ ко всем дочерним текстовым элементам в этом продукте, только странный вариант заголовка. Подход xpath кажется идеальным, поскольку он позволяет мне извлекать эти данные без необходимости прокручивать страницу с помощью ключевых проходов / javascript.

products = driver.find_elements_by_xpath("//div[text()='Flower']/following-sibling::div/div")
for product in products:
    print ("Flower", product.text)

Что бы я добавил к приведенному выше утверждению, если бы хотел извлечь полный набор элементов, содержащих текст для всех дочерних элементов в рамках 'consumer-product-card__InViewContainer', в каждой категории ... например, цветок, предварительные ролики и т. Д. . Прошлой ночью у меня истекли разные подходы и разные пути / узлы / предикаты, чтобы попытаться получить доступ к этой информации, построенной на приведенном выше коде, но в конечном итоге потерпел неудачу.

Также есть ли у меня способ протестировать или каким-то образом визуализировать, «где я» с точки зрения объема данного оператора xpath?

Заранее спасибо!

0
T0ne 5 Май 2021 в 01:14

1 ответ

Лучший ответ

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

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

driver = webdriver.Chrome()
wait = WebDriverWait(driver, 60)
driver.get('https://dutchie.com/embedded-menu/revolutionary-clinics-somerville/menu')

All_Heading = wait.until(
    EC.visibility_of_all_elements_located((By.XPATH, "//div[contains(@class,\"products-grid__ProductGroupTitle\")]")))

for heading in All_Heading:
    driver.execute_script("return arguments[0].scrollIntoView(true);", heading)
    print("------------- " + heading.text + " -------------")
    ChildElement = heading.find_elements_by_xpath("./../div/div")
    for child in ChildElement:
        driver.execute_script("return arguments[0].scrollIntoView(true);", child)
        print(child.text)

Найдите вывод приведенного выше кода -

enter image description here

Надеюсь, это то, что вы ищете. Если это решит ваш вопрос, отметьте его как ответ.

1
Swaroop Humane 4 Май 2021 в 23:54