2015-10-10 73 views
2

在一個典型的eBay搜索查詢中,返回50個以上的列表,例如this,eBay以網格格式顯示(無論您是否將其設置爲顯示爲網格或列表)。通過WebDriver一起查找類名的孩子和父母?

我使用的類名稱中使用的webdriver拔出價格:

enter image description here

prices = webdriver.find_all_elements_by_class_name("bidsold") 

挑戰:雖然頁面上所有的價格在結構上看起來相同,在那些有劃掉(其中現在購買不可用,它的最佳報價接受)實際上包含在以上跨度的子範圍內:

enter image description here

我可以通過用類重複find_all_elements_by_class_name方法sboffer分別拉這些出來,但(I)I將失去的順序的軌道,並且更重要的是(ii)其將大致一倍的時間它需要提取價格。

這兩種價格的CSS選擇器也是不同的,XPath也是如此。

我們如何一舉抓住所有價格?

回答

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元素,而不是整個頁面。這應該會提高性能。

+0

有趣的方法,謝謝。如果我得到'prices_on_page'的長度,那麼它的長度是45,而不是51.這也正好是'driver.find_elements_by_class_name(「bidsold」)'的長度。看到這裏:http://pastebin.com/v8suRmTg – Pyderman

+0

我想知道爲什麼'prices_list'也有長度45。 – Pyderman

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']]