首页 > 编程问答 >如何在Python中使用Selenium提取data-v-xxx?

如何在Python中使用Selenium提取data-v-xxx?

时间:2024-07-23 03:51:28浏览次数:9  
标签:python selenium-webdriver

因为我想查看每个 class='num' 内的文本是否大于 0。

如果测试通过,那么我需要获取venuen-name 内的文本。我观察到,data-v 是相同的。所以我的方法是获取相同的 data-v-<hash value> 来查找场地名称。我尝试了不同的方法来提取,但仍然无法提取。有什么建议吗?

这是 DOM

<div data-v-3122d63c="" class="el-row chooseTime" data-v-012d0593="">
    <div data-v-3122d63c="" class="el-col el-col-5 el-col-xs-0">
        <img data-v-174fb000="" data-v-3122d63c=""
            src="https://lcsd-smartplay.oss-cn-hongkong.aliyuncs.com/pic/default_facility.jpeg" alt="smartplay"
            class="venuen-img">
    </div>
    <div data-v-3122d63c="" class="el-col el-col-9 el-col-xs-24">
        <h3 data-v-3122d63c="" class="venuen-name">foo</h3>
    </div>
    <div data-v-3122d63c="" class="el-col el-col-10 el-col-xs-24">
        <div data-v-3122d63c="" class="el-row">
            <div data-v-3122d63c="" class="site el-col el-col-24">boo</div>
            <div data-v-3122d63c="" class="el-col el-col-24 el-col-xs-24" style="padding: 2px 0px;">
                <div data-v-752ea580="" data-v-3122d63c="" class="facilities-date-list-box">
                    <div data-v-42c8b4a0="" data-v-752ea580="">
                        <div data-v-42c8b4a0="" class="smart-play-mobile">

                        </div><!----><!----><!---->
                        <div data-v-42c8b4a0="" class="smart-play-mobile-tablet">

                        </div>
                    </div>
                    <div data-v-752ea580="" class="facilities-date-list-hidden scroll-wrap-223-308">
                        <div data-v-752ea580="" class="facilities-date-list-scroll scroll-223-308">
                            <div data-v-752ea580="" class="facilities-date-list-item">
                                <div data-v-752ea580="" class="relative item-num-box-disable">
                                    <div data-v-752ea580="" class="time flex">yyy</div>
                                    <div data-v-752ea580="" class="num">0</div><!---->
                                </div>
                            </div>
                            <div data-v-752ea580="" class="facilities-date-list-item">
                                <div data-v-752ea580="" class="relative item-num-box-disable">
                                    <div data-v-752ea580="" class="time flex">xxx</div>
                                    <div data-v-752ea580="" class="num">0</div><!---->
                                </div>
                            </div>
                            <div data-v-752ea580="" class="facilities-date-list-item">
                                <div data-v-752ea580="" class="relative item-num-box-disable">
                                    <div data-v-752ea580="" class="time flex">zzz</div>
                                    <div data-v-752ea580="" class="num">0</div><!---->
                                </div>
                            </div>
                            <div data-v-752ea580="" class="facilities-date-list-item">
                                <div data-v-752ea580="" class="relative item-num-box-disable">
                                    <div data-v-752ea580="" class="time flex">qqq</div>
                                    <div data-v-752ea580="" class="num">0</div><!---->
                                </div>
                            </div>
                            <div data-v-752ea580="" class="facilities-date-list-item">
                                <div data-v-752ea580="" class="relative item-num-box-disable">
                                    <div data-v-752ea580="" class="time flex">qqq</div>
                                    <div data-v-752ea580="" class="num">0</div><!---->
                                </div>
                            </div>
                        </div>
                    </div>
                    <div data-v-42c8b4a0="" data-v-752ea580="">
                        <div data-v-42c8b4a0="" class="smart-play-mobile"></div><!----><!----><!---->
                        <div data-v-42c8b4a0="" class="smart-play-mobile-tablet"></div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

for element in driver.find_elements(By.CLASS_NAME, 'num'):
        if int(element.text) == 1:
            vue_hash = element.find_element(By.XPATH, "./ancestor::div[contains(@data-v-,'')]").text

你现在的思路是正确的,只是在使用 ancestor::div[contains(@data-v-,'')] 定位祖先元素时,没有指定具体的 data-v- 值。

为了解决这个问题,你可以采取以下两种方法:

方法一:使用更具体的XPath定位祖先元素

你可以使用更具体的XPath表达式,例如 ./ancestor::div[contains(@class, 'chooseTime') and contains(@data-v-, '')] ,来定位包含 class='chooseTime' data-v- 属性的祖先元素。

修改后的代码如下:

for element in driver.find_elements(By.CLASS_NAME, 'num'):
    if int(element.text) == 1:
        # 找到包含 'chooseTime' 类和 'data-v-' 属性的祖先元素
        ancestor_element = element.find_element(
            By.XPATH, "./ancestor::div[contains(@class, 'chooseTime') and contains(@data-v-, '')]"
        )

        # 获取祖先元素的 'data-v-' 属性值
        vue_hash = ancestor_element.get_attribute("data-v-")

        # 找到拥有相同 'data-v-' 属性值的 'venuen-name' 元素
        venue_name_element = driver.find_element(
            By.XPATH, f"//h3[@class='venuen-name' and ancestor::div[@data-v-'{vue_hash}']]"
        )

        # 获取场地名称
        venue_name = venue_name_element.text
        print(venue_name)

方法二:遍历所有祖先元素并检查 'data-v-' 属性

你可以遍历所有祖先元素,并检查其 data-v- 属性是否等于目标值。

修改后的代码如下:

for element in driver.find_elements(By.CLASS_NAME, 'num'):
    if int(element.text) == 1:
        # 遍历所有祖先元素
        current_element = element
        while current_element.tag_name != 'html':
            current_element = current_element.find_element(By.XPATH, "..")
            vue_hash = current_element.get_attribute("data-v-")
            if vue_hash is not None:
                # 找到 'venuen-name' 元素
                venue_name_element = driver.find_element(
                    By.XPATH, f"//h3[@class='venuen-name' and ancestor::div[@data-v-'{vue_hash}']]"
                )

                # 获取场地名称
                venue_name = venue_name_element.text
                print(venue_name)
                break

这两种方法都可以帮助你找到拥有相同 data-v- 属性值的 venuen-name 元素。 选择哪种方法取决于你的具体情况和个人偏好。

标签:python,selenium-webdriver
From: 78780305

相关文章

  • Python:添加异常上下文
    假设我想提出一个异常并提供额外的处理信息;最好的做法是什么?我想出了以下方法,但对我来说有点可疑:definternal_function():raiseValueError("smellysocks!")defcontext_function():try:internal_function()exceptExceptionase:......
  • 【视频】Python遗传算法GA优化SVR、ANFIS预测证券指数ISE数据-CSDN博客
    全文链接:https://tecdat.cn/?p=37060本文旨在通过应用多种机器学习技术,对交易所的历史数据进行深入分析和预测。我们帮助客户使用了遗传算法GA优化的支持向量回归(SVR)、自适应神经模糊推理系统(ANFIS)等方法,对数据进行了特征选择、数据预处理、模型训练与评估。实验结果表明,这些方法......
  • Python学习笔记42:游戏篇之外星人入侵(三)
    前言在之前我们已经创建好了目录,并且编写好了游戏入口的模块。今天的内容主要是讲讲需求的分析以及项目各模块的代码初步编写。在正式编写代码前,碎碎念几句。在正式编写一个项目代码之前,实际是有很多工作要做的。就项目而言,简单的定项,需求对齐,项目架构设计,实际的代码编写,......
  • Python入门知识点 5--流程控制语句
    先来分享一个pycharm使用小技巧   红色波浪线:提醒可能报错   黄色波浪线:提醒书写不规范,ctrl+alt+l去掉黄线   code--Reformatcode,就可以去掉黄线,调整代码格式1、程序三大执行流程(1)顺序执行        程序执行时,代码从上往下,从左往右执行,中间......
  • python里读写excel等数据文件的几种常用方式
    python处理数据文件第一步是要读取数据,文件类型主要包括文本文件(csv、txt等)、excel文件、数据库文件、api等。下面整理下python有哪些方式可以读取数据文件。1.python内置方法(read、readline、readlines)read():一次性读取整个文件内容。推荐使用read(size)方法,size越大......
  • python+flask计算机毕业设计鲜花坊销售平台(程序+开题+论文)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着电子商务的迅猛发展,线上购物已成为人们日常生活的重要组成部分,尤其在追求生活品质与个性化的今天,传统鲜花销售行业正经历着深刻的变革......
  • python+flask计算机毕业设计快递驿站管理系统(程序+开题+论文)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着电子商务的迅猛发展,快递行业迎来了前所未有的繁荣期,快递包裹量急剧增长,对快递末端配送服务提出了更高的要求。传统的快递配送模式面临......
  • python-爬虫实例(4):获取b站的章若楠的视频
    目录前言        道路千万条,安全第一条        爬虫不谨慎,亲人两行泪获取b站的章若楠的视频一、话不多说,先上代码二、爬虫四步走1.UA伪装2.获取url3.发送请求 4.获取响应数据进行解析并保存 总结前言        道路千万条,安全第一条......
  • 使用Python和Pygame创建简单的音乐播放器
    在本篇博客中,我们将探讨如何使用Python编写一个简单的音乐播放器,并通过Pygame库实现音乐的播放和控制。我们将逐步介绍代码的功能和实现原理,以便读者能够了解每个部分的作用和如何在自己的项目中应用类似的技术。介绍音乐播放器是日常生活中常见的应用程序之一,它允许我们播放......
  • python中datetime模块
    importdatetime#fromdatetimeimportdate#1.获取当前时间2024-06-0617:30:20.733408print(datetime.datetime.now())#2.获取当前日期2024-06-06today=datetime.date.today()#获取年月日print(today.year)print(today.month)print(today.day)#......