Как перебирать дочерние веб-элементы в Python Webbot/Selenium?

У меня есть таблица результатов поиска в браузере Selenium, и каждый результат поиска определяется в Html следующим образом:

<div class = "item
            itemWrapper
            ItemPosition1
            ItemMonitor
            " data-position = "1" data-it-name = "NAME OF THE ITEM" data-it-category = "Category" role = "article">

    <div class = "item-image">

        <a href = "/some/link/" target = "_blank" rel = "noopener" class = "itemRec">
            <img src = "https://some.jpg" alt = "some name" class = "img-responsive">
        </a>
                        
    </div>

    <h2 class = "small-text item-title">
        <a href = "/some/other/link" class = "sendItem" target = "_blank" rel = "noopener">Link Text</a>
    </h2>

    <div class = "item-bottom">

        <div class = "pull-left item-price">
                <span>999</span>
        </div>

        <div class = "pull-right detail-link">
            <a href = "/link/to/detail" title = "link title" class = "detail"
                Detail
            </a>        
        </div>
    </div>
</div>  

Я могу найти все веб-элементы по classname = item.

elements = driver.find_elements_by_class_name("item")

Мне нужно было бы перебрать элементы и получить их положение, имя и цену, чтобы иметь возможность щелкнуть по одному из них:

for e in elements:
   position=e.get_attribute("data-position").value, 
   name=e.get_attribute("data-it-name").value, 
   price=e.find_element(By.CLASS_NAME,'item-price').value

но это не работает - get_attribute возвращает None, а find_element не находит ни одного дочернего элемента

Не могли бы вы посоветовать мне, как правильно получить атрибуты "data-" и значения дочерних элементов?

Весь код с использованием Webbot:

import webbot
from selenium.webdriver.common.by import By
web = webbot.Browser()

web.go_to('www.***.cz')
web.type('bed', classname='header-search-form')
web.press(web.Key.ENTER)
elements = web.find_elements(classname = "product-item")
for e in elements:
    name = e.get_attribute("data-it-name").value
    price = e.find_element(By.CLASS_NAME, 'item-price').value
    print(name,price)
    break

Не могли бы вы создать воспроизводимый пример, включая ту часть, где вы переходите на сайт? Спасибо.

alecxe 18.12.2020 21:43

Я добавил весь код, включая страницу. Я использую пакет webbot, основанный на Selenium.

Myk 18.12.2020 22:16
Почему в 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
2
416
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

classname странно себя ведет в веб-боте. Вы определенно не получаете товар там:

In [56]: elements[0].get_attribute('outerHTML')
Out[56]: '<a href = "/">\n\n\t\t\t\t\t\t<img src = "https://s.favi.cz/static/frontend/_global/images/favi-logo/favi-logo.60d511aff13247dd52f15acf6bdf2af9.svg" role = "banner">\n\n\t\t\t\t\t</a>'

Хорошо работает с селектором CSS:

In [58]: elements = web.find_elements(css_selector = ".product-item")

In [59]: elements[0].get_attribute('outerHTML')
Out[59]: '<div class = "\n\t\t\tproduct-item\n\t\t\titemWrapper\n\t\t\tproductItemPosition1\n\t\t\tproductItemMonitor\n\t\t\tproductItemWrapper\n\t\t\tsendProductTransactionWrapper\n\t\t\t\t\t" data-position = "1" data-pr-name = "Moderní box spring postel Alvares 160x200, bílá" data-tr-id = "04d62b60-9d00-4d1b-b03c-2258c50bfdb9" data-pr-category = "Postele" data-tr-ob-id = "2144583" data-m-ob-id = "2345478" role = "article">\n\n\t\t<div class = "product-image">\n\n\t\t\t<a href = "/produkty/nakupovat/2345478/1/84/1/searchBlockSearch/04d6ec5f-0aaf-458e-8754-58f7ccf4e971/04d62b60-9d00-4d1b-b03c-2258c50bfdb9" target = "_blank" rel = "noopener" class = "\n\t\t\t\t\tsendProductTransaction\n\t\t\t\t\tproductRecommendation\t\t\t\t\t\t\t\t\t">\n\t\t\t\t\t\t\t\t\t<img src = "https://s.favi.cz/static/images/t/product/300/6f/92/6f922779-bc84-483e-b1cd-ad8522ef0c92.jpg" alt = "Moderní box spring postel Alvares 160x200, bílá" class = "img-responsive">\n\t\t\t\t\t\t\t</a>\n\n\t\t\t<a href = "#" title = "Líbí se mi" class = "\n\t\t\t\t\tuser-like\n\t\t\t\t\tuserLike\n\t\t\t\t\tproductRecommendation\t\t\t\t\t\t\t\t\t\twith-count\t\t\t\t" data-like-product-master-id = "2144583">\n\t\t\t\t\t\t\t\t\t<span class = "count">485</span>\n\t\t\t\t\t\t\t</a>\n\n\t\t\t\n\t\t\t\n\t\t</div>\n\n\t\t<div class = "product-labels stickers-holder">\n\n\t\t\t\t\t\t\t<span class = "sticker storage white">\n\t\t\t\t\t<span class = "text">Skladem</span>\n\t\t\t\t</span>\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t</div>\n\n\t\t<h2 class = "small-text product-item-title">\n\t\t\t<a href = "/produkty/nakupovat/2345478/1/84/1/searchBlockSearch/04d6ec5f-0aaf-458e-8754-58f7ccf4e971/04d62b60-9d00-4d1b-b03c-2258c50bfdb9" class = "\n\t\t\t\t\tsendProductTransaction\n\t\t\t\t\tproductRecommendation\t\t\t\t" target = "_blank" rel = "noopener">Moderní box spring postel Alvares 160x200, bílá</a>\n\t\t</h2>\n\n\t\t<div class = "product-bottom">\n\n\t\t\t<div class = "pull-left product-item-price">\n\t\t\t\t<span>15 599 Kč</span>\n\t\t\t\t\t\t\t</div>\n\n\t\t\t<div class = "pull-right product-shop-link">\n\t\t\t\t<a href = "/produkty/p/luxusni-box-spring-postel-alves-160x200-bila?v=2345478" title = "Moderní box spring postel Alvares 160x200, bílá" class = "btn btn-bordered btn-sm sendProductTransaction">\n\t\t\t\t\tDetail\n\t\t\t\t</a>\n\n\t\t\t\t<a href = "/produkty/nakupovat/2345478/1/84/1/searchBlockSearch/04d6ec5f-0aaf-458e-8754-58f7ccf4e971/04d62b60-9d00-4d1b-b03c-2258c50bfdb9" target = "_blank" rel = "noopener" class = "\n\t\t\t\t\t\tbtn\n\t\t\t\t\t\tbtn-std\n\t\t\t\t\t\tbtn-sm\n\t\t\t\t\t\tproductRecommendation\t\t\t\t\t\tsendProductTransaction\n\t\t\t\t\t">\n\t\t\t\t\t<strong>Do obchodu</strong>\n\t\t\t\t</a>\n\t\t\t</div>\n\n\t\t</div>\n\n\t\t\n\t</div>'

In [60]: elements[0].get_attribute('data-position')
Out[60]: '1'

In [61]: elements[0].get_attribute('data-pr-name')
Out[61]: 'Moderní box spring postel Alvares 160x200, bílá'

Спасибо, вы правы, с Css это работает. Странно, что атрибут 'data-position' работает, но e.get_attribute("data-pr-name") по-прежнему ничего не возвращает

Myk 18.12.2020 23:00

@Myk, да, странно. data-pr-name только что сработало для меня, обновил ответ. Это также может быть проблема со временем, попробуйте добавить ожидание перед поиском товаров.

alecxe 18.12.2020 23:01

Вы были правы, ожидание работает. Большое спасибо за Вашу помощь.

Myk 18.12.2020 23:35

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