python+selenium 使用for循环,遍历 定位 获取 单个元素中想要的值

                                   python+selenium 使用for循环,遍历 定位 获取 单个元素中想要的值

1、HTML结构




    
    Title


商品1 价格: 99
评价: 111
商品2 价格: 88
评价: 222
商品3 价格: 77
评价不存在:

2、页面展示

python+selenium 使用for循环,遍历 定位 获取 单个元素中想要的值_第1张图片

3、python代码

from selenium import webdriver
from selenium.common.exceptions import NoSuchElementException  # 导入NoSuchElementException

driver = webdriver.Chrome()  # 打开谷歌浏览器
driver.get("http://tp.local.com/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("div.comment i").text  # 评价
    except NoSuchElementException:
        comment = 0

    print("第[%s]个商品,标题[%s],地址[%s],价格[%s],评论[%s]"%(i+1, title, href, price, comment))

4、执行结果

python+selenium 使用for循环,遍历 定位 获取 单个元素中想要的值_第2张图片

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属性来找到一个靠近的元素(比较理想的是父元素),这样你就可以依靠他们的相对关系来确定目标元素的位置。这种情况改变的可能就小了很多了,我们写的测试程序也会更可靠。

你可能感兴趣的:(#,PythonSelenium)