python+selenium使用xpath定位的问题及解决

 更新时间:2024年05月16日 14:39:32   作者:wuXu_0720  
这篇文章主要介绍了python+selenium使用xpath定位的问题及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

python用selenium调chrome爬取网页信息遇到报错

1.InvalidSelectorException: Message: invalid selector: The result of the xpath expression is [object Attr]. It should be an element

原因是selenium不支持从xpath中直接获取text文本信息。

name=web.find_element(By.XPATH,"/html/body/div[3]/div/div[2]/h2/text()")
website=web.find_element(By.XPATH,"/html/body/div[3]/div/div[2]/a[3]/@href")

xpath表达式修改为:

name=web.find_element(By.XPATH,"/html/body/div[3]/div/div[2]/h2/text()")
website=web.find_element(By.XPATH,"/html/body/div[3]/div/div[2]/a[3]/@href")

2.Message: no such element: Unable to locate element:

xpath表达式一直无法准确定位,原因是通过浏览器开发者工具copy的xpath表达式和实际selenium获取的网页资源不同,表达式错误无法定位。(经对比发现是selenium有一个需用户同意的cookie弹窗)

通过print(web.page_source)拿到selenium获取的网页资源,发现有一个div未加载出来。

其实应该是body下第2个div。

通过开发者工具重新获得准确的xpath表达式。

原xpath表达式:

title = web.find_element(By.XPATH,"/html/body/div[3]/div/div[2]/h2").text

改为正确的xpath表达式:

title = web.find_element(By.XPATH,"/html/body/div[2]/div/div[2]/h2").text

3.使用发现selenium效率过低,一个网页全部加载完毕要1分钟左右。

解决办法是设置最长加载时长,超过时长则停止加载,开始定位数据。

from selenium.common.exceptions import TimeoutException
 
web = webdriver.Chrome()
web.set_page_load_timeout(10)#设置页面加载时长
web.set_script_timeout(10)#设置JS加载时长
 
try:
	web.get(str(url))
except TimeoutException: #加载超时异常处理
	web.execute_script('window.stop()')  

python selenium xpath高级定位用法

目前很多网页前端代码是框架或 JS 生成的,就导致了混乱而难以定位。

为了快速而又复杂定位 Selenium 中有一个 Xpath 选择器,可以选择复杂的页面定位,也是爬虫在网页定位中的较优的选择。

1、通过绝对路径定位元素

driver.find_element_by_xpath("html/body/div/form/input")

2、通过相对路径定位元素

driver.find_element_by_xpath("//input")

3、使用索引定位元素

driver.find_element_by_xpath("//input[1]")

4、使用XPATH的属性值定位元素

driver.find_element_by_xpath("//input[@id='username']")
driver.find_element_by_xpath("//input[@type='submit'][@name='sub1']")
driver.find_element_by_xpath("//input[@type='submit' and @name='sub1']")
driver.find_element_by_xpath("//input[@type='submit' or @name='sub1']")

5、使用XPATH的属性名称定位元素

# 查找所有input标签中含有type属性的元素
driver.find_element_by_xpath("//input[@type]")
 
# 查找所有a标签中含有onclick属性的元素
driver.find_element_by_xpath("//a[@onclick]")
 
.....

6、使用任意值来匹配属性及元素

# 匹配所有input元素中含有属性的值为readonly的元素
driver.find_element_by_xpath("//input[@*='readonly']"))

7、使用模糊的属性值匹配

  • starts-with():匹配一个属性开始位置的关键字,是模糊定位的一种。
# 匹配id以submit开头的元素,如:id='submit'
driver.find_element_by_xpath("//input[start-with(@id,'submit')]")
  • ends-with():匹配一个属性结束位置的关键字,是模糊定位的一种。
# 匹配id以submit结尾的元素,如:id='submit'
driver.find_element_by_xpath("//input[ends-with(@id,'submit')]")
contains():匹配一个属性值中包含的字符串,也是模糊定位的一种。

# 匹配id中含有submit的元素,如:id='submit'
driver.find_element_by_xpath("//input[contains(@id,'submit')]")
 
# 匹配name属性中包含na关键字的页面元素
driver.find_element_by_xpath("//input[contains(@name,'na')]")
text():根据文本信息匹配元素位置。

# 如:<a href="http://www.baidu.com" rel="external nofollow" >百度搜索</a>
driver.find_element_by_xpath("//a[text()='百度搜索'] ")
driver.find_element_by_xpath("//a[contains(text(),"百度搜索")]")
last():函数位置定位。

# 表示div元素->form元素->input元素的最后一个子元素,得到id值为e2的E元素
driver.find_element_by_xpath("/div/form/input[last()]")

8、过虑某个元素

  • name():获取标签名称。
# 表示过虑掉在 div id='query_reulst_box' 的下的 style 标签和 meta 标签
driver.find_element_by_xpath("//div[@id='query_reulst_box']/*[not(name()='style' and name()='meta')]//text())

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Python读取系统文件夹内所有文件并统计数量的方法

    Python读取系统文件夹内所有文件并统计数量的方法

    今天小编就为大家分享一篇Python读取系统文件夹内所有文件并统计数量的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-10-10
  • Python中命名元组Namedtuple的使用详解

    Python中命名元组Namedtuple的使用详解

    Python支持一种名为“namedtuple()”的容器字典,它存在于模块“collections”中,下面就跟随小编一起学习一下Namedtuple的具体使用吧
    2023-09-09
  • tkinter如何获取复选框(Checkbutton)的值

    tkinter如何获取复选框(Checkbutton)的值

    这篇文章主要介绍了tkinter如何获取复选框(Checkbutton)的值问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-01-01
  • Python绘制交通流折线图详情

    Python绘制交通流折线图详情

    这篇文章主要介绍了Python绘制交通流折线图详情,文章基于python的相关资料展开折线图绘制的实现流程,感兴趣的小伙伴可以参考一下
    2022-06-06
  • python微信跳一跳游戏辅助代码解析

    python微信跳一跳游戏辅助代码解析

    本篇文章给大家详细讲解了用python写的一个微信跳一跳辅助脚本的源码,对此有兴趣的朋友参考下吧。
    2018-01-01
  • Python使用gensim计算文档相似性

    Python使用gensim计算文档相似性

    在文本处理中,比如商品评论挖掘,有时需要了解每个评论分别和商品的描述之间的相似度,以此衡量评论的客观性。那么python 里面有计算文本相似度的程序包吗,恭喜你,不仅有,而且很好很强大。下面我们就来体验下gensim的强大
    2016-04-04
  • 如何将Python彻底卸载的三种方法

    如何将Python彻底卸载的三种方法

    通常我们在一些软件的使用上有碰壁,第一反应就是卸载重装,所以有小伙伴就问我Python怎么卸载才能彻底卸载干净,今天这篇文章,小编就来教大家如何彻底卸载Python,需要的朋友可以参考下
    2025-04-04
  • PyQT5速成教程之Qt Designer介绍与入门

    PyQT5速成教程之Qt Designer介绍与入门

    这篇文章主要介绍了PyQT5速成教程之Qt Designer介绍与入门,本文以PyCharm为例通过实例代码图文相结合给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-11-11
  • python爬虫爬取图片的简单代码

    python爬虫爬取图片的简单代码

    在本篇文章里小编给大家整理的是一篇关于python爬虫爬取图片的简单代码内容,有兴趣的朋友们可以测试下。
    2021-01-01
  • python微信公众号开发简单流程实现

    python微信公众号开发简单流程实现

    这篇文章主要介绍了python微信公众号开发简单流程实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-03-03

最新评论