【问题标题】:Finding both child and parent by class name in one go with WebDriver?使用 WebDriver 一次性按类名查找子级和父级?
【发布时间】:2016-01-08 15:20:04
【问题描述】:

在返回超过 50 个列表的典型 eBay 搜索查询中,例如 this,eBay 以网格格式显示(无论您将其设置为显示为网格还是列表)。

我正在使用类名来使用 WebDriver 提取价格:

prices = webdriver.find_all_elements_by_class_name("bidsold")

挑战:虽然页面上的所有价格在结构上看起来都相同,但被划掉的价格(立即购买不可用,而是 接受的最佳报价)实际上包含在上述跨度的子跨度内:

我可以通过使用类 sboffer 重复 find_all_elements_by_class_name 方法来单独提取这些,但是 (i) 我会忘记顺序,更重要的是 (ii) 它会使提取价格所需的时间。

两种价格类型的 CSS 选择器也不同,XPath 也是如此。

我们如何一次性获取所有价格?

【问题讨论】:

    标签: python html css selenium selenium-webdriver


    【解决方案1】:

    试试这个:

    from selenium import webdriver
    
    driver = webdriver.Firefox()
    driver.get('http://www.ebay.com/sch/i.html?rt=nc&LH_Complete=1&_nkw=Columbia+Hiking+Pants&LH_Sold=1&_sacat=0&LH_BIN=1&_from=R40&_sop=3&LH_ItemCondition=1000&_pgn=2')
    
    prices_list = driver.find_elements_by_css_selector('span.amt')
    prices_on_page = []
    for span in prices_list:
        unsold_item = span.find_elements_by_css_selector('span.bidsold.bold')
        sold_item = span.find_elements_by_css_selector('span.sboffer')
        if len(sold_item):
            prices_on_page.append(sold_item[0].text)
        elif len(unsold_item):
            prices_on_page.append(unsold_item[0].text)
        elif span.text:
            prices_on_page.append(span.text)
    
    print prices_on_page
    driver.quit()
    

    在这种情况下,您将跟踪订单,您将只查询特定的 span 元素而不是整个页面。这应该会提高性能。

    【讨论】:

    • 有趣的方法,谢谢。如果我得到prices_on_page 的长度,它是45,而不是51。这也恰好是driver.find_elements_by_class_name("bidsold") 的长度。见这里:pastebin.com/v8suRmTg
    【解决方案2】:

    我会选择 xpath- 下面的代码对我有用。它抢到了 50 个价格!

    from selenium import webdriver
    
    driver = webdriver.Firefox()
    driver.get('http://www.ebay.com/sch/i.html?rt=nc&LH_Complete=1&_nkw=Columbia+Hiking+Pants&LH_Sold=1&_sacat=0&LH_BIN=1&_from=R40&_sop=3&LH_ItemCondition=1000&_pgn=2')
    
    my_prices = []
    itms = driver.find_elements_by_xpath("//div[@class='bin']")
    for i in itms:
        prices = i.find_elements_by_xpath(".//span[contains(text(),'$')]")
        val =  ','.join(i.text for i in prices)
        my_prices.append([val])
    print my_prices
    driver.quit()
    

    结果是

    [[u'$64.95'], [u'$59.99'], [u'$49.95'], [u'$46.89,$69.99'], [u'$44.98'], [u'$42.95'], [u'$39.99'], [u'$39.99'], [u'$37.95'], [u'$36.68'], [u'$35.96,$44.95'], [u'$34.99'], [u'$34.99'], [u'$34.95'], [u'$30.98'], [u'$29.99'], [u'$29.99'], [u'$29.65,$32.95'], [u'$29.00'], [u'$27.96,$34.95'], [u'$27.50'], [u'$27.50'], [u'$26.99,$29.99'], [u'$26.95'], [u'$26.55,$29.50'], [u'$24.99'], [u'$24.99'], [u'$24.99'], [u'$24.99'], [u'$24.98'], [u'$24.98'], [u'$24.98'], [u'$24.98'], [u'$24.98'], [u'$22.00'], [u'$22.00'], [u'$22.00'], [u'$22.00'], [u'$18.00'], [u'$18.00'], [u'$17.95'], [u'$11.99'], [u'$9.99'], [u'$6.00']]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-02-18
      • 2015-12-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多