使用WebDriver一次性按类名查找子级和父级?

时间:2015-10-10 21:37:26

标签: python html css selenium selenium-webdriver

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

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

enter image description here

prices = webdriver.find_all_elements_by_class_name("bidsold")

挑战:虽然页面上的所有价格在结构上都是相同的,但是那些被划掉的价格(立即购买不可用且它是接受的最佳报价)实际上包含在上述范围的子跨度中:

enter image description here

我可以通过使用类 sboffer 重复find_all_elements_by_class_name方法来单独解决这些问题,但是(i)我将失去对顺序的跟踪,更重要的是(ii)它会粗略地将提取价格所需的时间翻倍。

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

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

2 个答案:

答案 0 :(得分:3)

试试这个:

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元素而不是整个页面。这应该可以提高性能。

答案 1 :(得分:3)

我会选择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']]