Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用WebDriver一次通过类名查找子级和父级?_Python_Html_Css_Selenium_Selenium Webdriver - Fatal编程技术网

Python 使用WebDriver一次通过类名查找子级和父级?

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)提取价格所需的时间将增加一

在返回超过50个物品的典型易趣搜索查询中,例如易趣以网格格式显示(无论您是否将其设置为显示为网格或列表)

我使用类名通过WebDriver获取价格:

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

我可以通过使用类sboffer重复
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']]