Как l oop несколько элементов в python селен (разные CSS селекторы) - PullRequest
0 голосов
/ 05 марта 2020

Я пытаюсь l oop внутри класса offer-list-wrapper, который имеет несколько элементов внутри, почти все элементы являются общими на веб-странице для поиска A и поиска B (я очищаю сканер).

Как вы можете видеть на обоих изображениях, offer-list-wrapper является общим элементом.

Я хочу извлечь данные, которые находятся внутри каждого organic-offer-wrapper organic-gallery-offer-inner и organic-list-offer-inner m-gallery-product-item-v2 классов. Что очень легко сделать, если вы поместите в них oop с помощью селектора CSS, например:

for element in driver.find_elements_by_css_selector('.organic-list-offer-inner.m-gallery-product-item-v2'):

Таким образом, вы можете получить каждый элемент внутри них.

enter image description here

enter image description here

НО проблема начинается здесь: мне нужно l oop внутри обоих случаев с ОДНИМ универсалом c код, который l oop внутри обоих классов, и в случае появления нового класса он должен l oop внутри него.

Позвольте мне показать вам мой код:

for element in driver.find_elements_by_class_name('offer-list-wrapper'):
    try:
        item_name = element.find_element_by_class_name('organic-gallery-title__content').text
    except:
        item_name = np.nan
    try:
        price = element.find_element_by_class_name('gallery-offer-price').get_attribute('title').replace('$', '').replace(',', '')
        min_order = element.find_element_by_class_name('gallery-offer-minorder').find_element_by_tag_name('span').text.replace(' Pieces', '').replace(' Piece', '').replace(' Units', '').replace(' Unit', '').replace(' Sets', '').replace(' Set', '').replace(' Pairs', '').replace(' Pair', '').replace('Boxes', '').replace('Box', '').replace('Bags', '').replace('Bag', '')     
        # separate min and max price
    except:
        price = np.nan
        min_order = np.nan

Этот первый возвращает только первый элемент:

for element in driver.find_elements_by_css_selector('.organic-offer-wrapper.organic-gallery-offer-inner'):
    try:
        item_name = element.find_element_by_class_name('organic-gallery-title__content').text
    except:
        item_name = np.nan
    try:
        price = element.find_element_by_class_name('gallery-offer-price').get_attribute('title').replace('$', '').replace(',', '')
        min_order = element.find_element_by_class_name('gallery-offer-minorder').find_element_by_tag_name('span').text.replace(' Pieces', '').replace(' Piece', '').replace(' Units', '').replace(' Unit', '').replace(' Sets', '').replace(' Set', '').replace(' Pairs', '').replace(' Pair', '').replace('Boxes', '').replace('Box', '').replace('Bags', '').replace('Bag', '')     
        # separate min and max price
    except:
        price = np.nan
        min_order = np.nan

Этот второй возвращает только циклы внутри .organic-offer-wrapper.organic-gallery-offer-inner (возвращая все нужные мне элементы), но не l oop внутри .organic-list-offer-inner.m-gallery-product-item-v2

1 Ответ

1 голос
/ 05 марта 2020

Вы можете получить все продукты, выполнив поиск тегов div, которые содержат атрибут data-content = "productItem" . Это предполагает, что каждый элемент имеет этот атрибут. Из скриншотов, которые вы разместили, кажется, что это так.

Вы можете выполнить sh это с помощью find_elements_by_xpath ()

for item in driver.find_elements_by_xpath('//div[@data-content="productItem"]'):
    ....

Это, вероятно, будет лучшим способом без необходимости беспокоиться об элементах, имеющих разные css классы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...