如何在已定位元素下查找子元素?解决Selenium重复获取首个href问题
遍历产品时无法正确获取每个产品的链接?
网页结构
<div class='product-pod-padding'> <a class='header product-pod--ie-fix' href='link1'></a> <div> SKU#1</div> </div> <div class='product-pod-padding'> <a class='header product-pod--ie-fix' href='link2'></a> <div> SKU#2</div> </div> <div class='product-pod-padding'> <a class='header product-pod--ie-fix' href='link3'></a> <div> SKU#3</div> </div>
当前情况
遍历产品获取SKU时能得到预期结果:
products=driver.find_elements_by_xpath("//div[@class='product-pod-padding']") for index, product in enumerate(products): print(product.text)
输出:
SKU#1 SKU#2 SKU#3
但尝试获取每个产品的href时,所有产品都返回第一个商品的链接:
products=driver.find_elements_by_xpath("//div[@class='product-pod-padding']") for index, product in enumerate(products): print(index) print(product.text) url=product.find_element_by_xpath("//a[@class='header product-pod--ie-fix']").get_attribute('href') print(url)
输出:
0 SKU#1 link1 1 SKU#2 link1 2 SKU#3 link1
解决方法
问题出在XPath的路径写法上://a[@class='header product-pod--ie-fix']是从整个文档的根节点开始查找匹配元素,所以每次都会返回第一个符合条件的a标签。要改成相对路径,在当前product节点的范围内查找,只需要在XPath开头加上.:
修改后的代码
products=driver.find_elements_by_xpath("//div[@class='product-pod-padding']") for index, product in enumerate(products): print(index) print(product.text) # 相对路径查找当前product下的a标签 url=product.find_element_by_xpath(".//a[@class='header product-pod--ie-fix']").get_attribute('href') print(url)
正确输出:
0 SKU#1 link1 1 SKU#2 link2 2 SKU#3 link3
另一种写法
也可以直接在初始XPath中同时定位div和内部的a标签,一次性获取所有信息:
# 直接定位每个product容器下的a标签 product_links = driver.find_elements_by_xpath("//div[@class='product-pod-padding']/a[@class='header product-pod--ie-fix']") for index, link in enumerate(product_links): # 获取当前a标签所在容器的SKU文本 sku = link.find_element_by_xpath("../div").text print(index) print(sku) print(link.get_attribute('href'))
内容的提问来源于stack exchange,提问作者yyiws
相关产品推荐
相关产品推荐

