Python 使用WebDriver一次通过类名查找子级和父级?
在返回超过50个物品的典型易趣搜索查询中,例如易趣以网格格式显示(无论您是否将其设置为显示为网格或列表) 我使用类名通过WebDriver获取价格: 挑战:尽管页面上的所有价格在结构上看起来都相同,但被划掉的价格(即“立即购买”不可用且接受最佳报价)实际上包含在上述跨度的子跨度内: 我可以通过使用类sboffer重复Python 使用WebDriver一次通过类名查找子级和父级?,python,html,css,selenium,selenium-webdriver,Python,Html,Css,Selenium,Selenium Webdriver,在返回超过50个物品的典型易趣搜索查询中,例如易趣以网格格式显示(无论您是否将其设置为显示为网格或列表) 我使用类名通过WebDriver获取价格: 挑战:尽管页面上的所有价格在结构上看起来都相同,但被划掉的价格(即“立即购买”不可用且接受最佳报价)实际上包含在上述跨度的子跨度内: 我可以通过使用类sboffer重复find\u all\u elements\u by\u class\u name方法来分别提取这些元素,但是(I)我将无法跟踪订单,更重要的是(ii)提取价格所需的时间将增加一
find\u all\u elements\u by\u class\u name
方法来分别提取这些元素,但是(I)我将无法跟踪订单,更重要的是(ii)提取价格所需的时间将增加一倍
两种价格类型的CSS选择器也不同,XPath也是如此
我们如何一次抓住所有价格 试试这个:
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元素,而不是整个页面。这将提高性能。我会选择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']]
有趣的方法,谢谢。如果我在页面上得到
prices\u的长度,它是45,而不是51。这恰好也是驱动程序的长度。按类名称(“bidsaled”)查找元素。请看这里:
[[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']]