python+selenium 使用for循环,遍历 定位 获取 单个元素中想要的值
1、HTML结构
<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><title>Title</title></head><body><div class="content"><!-- 单个商品 START --><div class="items"><a class="title href" href="" target="_blank">商品1</a><span class="price">价格:<em>99</em></span><div class="comment">评价:<i>111</i></div></div><!-- 单个商品 END --><!-- 单个商品 START --><div class="items"><a class="title href" href="" target="_blank">商品2</a><span class="price">价格:<em>88</em></span><div class="comment">评价:<i>222</i></div></div><!-- 单个商品 END --><!-- 单个商品 START --><div class="items"><a class="title href" href="" target="_blank">商品3</a><span class="price">价格:<em>77</em></span><div class="comment"><span style="color:red">评价不存在:</span></div></div><!-- 单个商品 END --></div></body></html>
2、页面展示
3、python代码
from selenium import webdriverfrom mon.exceptions import NoSuchElementException # 导入NoSuchElementExceptiondriver = webdriver.Chrome() # 打开谷歌浏览器driver.get("/index/index/") # 打开一个网址(本地地址)goods_arr = driver.find_elements_by_xpath("//div[@class='items']") # 获取到每个商品条目for i, goods in enumerate(goods_arr):title = goods.find_element_by_css_selector("a.title").text # 商品名href = goods.find_element_by_css_selector("a.title").get_attribute("href") # 地址price = goods.find_element_by_css_selector("span.price em").text # 价格# 评价不存在判断try:comment = goods.find_element_by_css_selector("ment i").text # 评价except NoSuchElementException:comment = 0print("第[%s]个商品,标题[%s],地址[%s],价格[%s],评论[%s]"%(i+1, title, href, price, comment))
4、执行结果
5、注意事项
1)、在for循环中,最好别使用 goods.find_element_by_xpath(),因为这个方法每次都是基于HTML根起点开始查找的,所以每次循环出来的结果都是一样的。
2)、有人说可以用变量i来定位 goods.find_elements_by_xpath("/a[@class='title']")[i]
这样也是有问题的,如果某个商品(不是最后一个商品)的title不存在,就会有问题。
比如说第二个商品的title不存在:
按照goods.find_elements_by_xpath("/a[@class='title']")[i]
第二个商品的title就会取到第三个的,这显然是不对的。
6、依据:python-selenium中文文档 - XPath定位
XPath是用来定位XML文档节点的语言。不过HTML可以看成是XML(XHTML)的一种实现。Selenium用户可以使用这个强力的语言来瞄准Web应用的元素。 XPath延伸了用id或者name属性来定位的单一方法,开创了许多可能性,例如定位页面的第三个复选框
用XPath的主要理由之一,就是你想定位的元素没有合适的id或者name属性的时候,你可以用XPath来对元素进行绝对定位(不推荐)或者把这个元素和另外一个有确定id或者name的元素关联起来(即相对定位)。XPath定位器也可以用来找出那些具有id,name以外属性的元素。
绝对的XPath定位包含了从HTML根节点起的所有元素,并且一些轻微的改变就会失效。而用id或者name属性来找到一个靠近的元素(比较理想的是父元素),这样你就可以依靠他们的相对关系来确定目标元素的位置。这种情况改变的可能就小了很多了,我们写的测试程序也会更可靠。