selenium中Xpath元素定位方法&爬虫开发实践

2022-10-1821:53:08云计算与物联网Comments1,000 views字数 2368阅读模式

什么是xpath?文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/28454.html

  • XPath是XML的路径语言,通俗一点讲就是通过元素的路径来查找到这个标签元素
  • XPath使用路径表达式在XML文档中进行导航
selenium中Xpath元素定位方法&爬虫开发实践文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/28454.html

  • 普通语法
selenium中Xpath元素定位方法&爬虫开发实践文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/28454.html

注意!文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/28454.html

1.xpath中的值用引号引起来时,在代码中要注意区分,内单外双,内双外单。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/28454.html

2.xapth的class的值要填写全部,注意与find_element_by_class_name的区别。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/28454.html

3.xpath还支持逻辑运算符and/or,多用and来缩小范围,例如//*[@id='username' and @type='text']文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/28454.html

4.要注意xpath中//input[1]代表第一个input标签,而不是用0,与python中的下标索引不同。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/28454.html

  • xpath轴语法

自动化测试中不常用,爬虫中常用,仅做了解。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/28454.html

学习网址:XPath Axes(轴)文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/28454.html

ancestor#选取当前节点的所有先辈(父、祖父等)。
ancestor-or-self#选取当前节点的所有先辈(父、祖父等)以及当前节点本身。
attribute#选取当前节点的所有属性。
child#选取当前节点的所有子元素。
descendant#选取当前节点的所有后代元素(子、孙等)。
descendant-or-self#选取当前节点的所有后代元素(子、孙等)以及当前节点本身。
following#选取文档中当前节点的结束标签之后的所有节点。
namespace#选取当前节点的所有命名空间节点。
parent#选取当前节点的父节点。
preceding#选取文档中当前节点的开始标签之前的所有节点。
preceding-sibling#选取当前节点之前的所有同级节点。
self#选取当前节点。

selenium中使用xpath

为了练习,我自己想了个需求。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/28454.html

用selenium的xpath定位方式写一个脚本,获取微博热搜内容文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/28454.html

步骤文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/28454.html

1.打开微博官网https://weibo.com文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/28454.html

2.找到热搜榜按钮位置,点击文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/28454.html

3.找到热搜标题位置,获得文本文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/28454.html

打开微博官网后我们找到热搜榜按钮,然后右键--检查,找到我们要点击的位置文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/28454.html

selenium中Xpath元素定位方法&爬虫开发实践文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/28454.html

发现这个标签里的属性比较多,所以首先尝试用属性法看能不能找到文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/28454.html

selenium中Xpath元素定位方法&爬虫开发实践文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/28454.html

通过role='link'找到4个,不唯一。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/28454.html

换title试试文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/28454.html

selenium中Xpath元素定位方法&爬虫开发实践文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/28454.html

咦,如此简单么,找到了文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/28454.html

接下来找热搜标题的xpath路径文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/28454.html

先手动复制热搜榜前五标题的xpath路径文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/28454.html

方法:选中标题位置--右键检查文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/28454.html

selenium中Xpath元素定位方法&爬虫开发实践文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/28454.html

找到对应标签行后,再右键--复制--XPath文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/28454.html

selenium中Xpath元素定位方法&爬虫开发实践文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/28454.html

得到前五条热搜名称的xpath路径,并观察规律文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/28454.html

selenium中Xpath元素定位方法&爬虫开发实践文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/28454.html

然后尝试精简路径。用尽可能短的路径定位到唯一元素(因为我发现路径太长,会概率性出现定位不到元素)文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/28454.html

根据找到的规律(变化最明显的点和最有识别度的标签名称)对路径进行简化,经过无数次的调试(我太菜了)文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/28454.html

精简后热搜第一名的可用路径为文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/28454.html

//main/div//div[2]//*[starts-with(@class,'HotTopic_tit_')]

ok,xpath的路径准备好之后,就可以写代码了文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/28454.html

from selenium import webdriver
from time import sleep
driver = webdriver.Firefox()#打开浏览器
url = 'https://weibo.com'
driver.get(url)#打开微博官网
sleep(5)
driver.find_element_by_xpath("//*[@]").click()#找到热搜榜并点击
for i in range(2,7):
    sleep(1)
    print(f'此时此刻热搜第{i-1}名为:'+driver.find_element_by_xpath(
        f"//main/div//div[{i}]//*[starts-with(@class,'HotTopic_tit_')]").text)

结果如下文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/28454.html

此时此刻热搜第1名为:张雪峰提议三胎家庭免学费
此时此刻热搜第2名为:浙江疫情
此时此刻热搜第3名为:读懂中央经济工作会议的深意
此时此刻热搜第4名为:医生建议看手机1小时后休息一下
此时此刻热搜第5名为:雪梨淘宝店铺被封

试了几次,成功率还是挺高的。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/28454.html

有点开心。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/28454.html

再整一下豆瓣的电影排行榜文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/28454.html

from selenium import webdriver
from time import sleep
driver = webdriver.Firefox()
url = 'https:/douban.com'
driver.get(url)
driver.find_element_by_xpath('/html/body/div[1]/div[2]/div[1]/ul/li[2]/a').click()
#这用的完整的绝对路径
sleep(5)
driver.find_element_by_xpath("//div/ul/li/a[text()='排行榜']").click()
#找规律精简后的路径
for i in range(1,11):
    sleep(2)
    print(f'豆瓣排行榜第{i}名:'+driver.find_element_by_xpath(f'//table[{i}]//a[@class=""]').text)

结果如下:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/28454.html

豆瓣排行榜第1名:最后的决斗 / 最后决斗(港)
豆瓣排行榜第2名:毒液2 / 毒魔:血战大屠杀(港) / 猛毒2:血蜘蛛(台)
豆瓣排行榜第3名:倒数时刻 / 滴答,滴答……轰隆隆 / 梦想期限(港)
豆瓣排行榜第4名:芬奇 / 芬奇的旅程 / 生化
豆瓣排行榜第5名:不速来客 / 眼见为虚 / Knock Knock
豆瓣排行榜第6名:斯宾塞 / 斯潘塞 / 黛妃(台)
豆瓣排行榜第7名:Soho区惊魂夜 / 苏豪的最后一夜(港) / 迷离夜苏活(台)
豆瓣排行榜第8名:圣母 / 圣欲(港/台) / 圣母玛利亚
豆瓣排行榜第9名:红色通缉令 / 红色大贱谍
豆瓣排行榜第10名:古驰家族 / GUCCI名门望族(港) / Gucci:豪门谋杀案(台)
文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/28454.html
  • 本站内容整理自互联网,仅提供信息存储空间服务,以方便学习之用。如对文章、图片、字体等版权有疑问,请在下方留言,管理员看到后,将第一时间进行处理。
  • 转载请务必保留本文链接:https://www.cainiaoxueyuan.com/yunda/28454.html

Comment

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定