首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Python Webbot/Selenium中遍历子webelements?

如何在Python Webbot/Selenium中遍历子webelements?
EN

Stack Overflow用户
提问于 2020-12-19 04:10:48
回答 1查看 167关注 0票数 0

我在Selenium浏览器中有一个搜索结果表,每个搜索结果在Html中定义如下:

代码语言:javascript
复制
<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找到所有的webelements。

代码语言:javascript
复制
elements = driver.find_elements_by_class_name("item")

我需要遍历元素,并获得它们的位置、名称和价格,以便能够单击其中之一:

代码语言:javascript
复制
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的完整代码:

代码语言:javascript
复制
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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-12-19 05:47:26

classname在webbot中的行为很奇怪。您肯定不会在那里获得产品项目:

代码语言:javascript
复制
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选择器配合使用效果很好:

代码语言:javascript
复制
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á'
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65363331

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档