python - 以 X 开头并以零或最小数字结尾的 Python XPath
问题描述
如果有人能帮我编写一个实现以下目标的 XPath,我将不胜感激:
- 查找具有以下 id 的元素:“revit_form_Button_50”,其中数字不断变化(可能是 30/40,但页面上的第一个似乎总是以 0 结尾)并且标题为“每日技术总计/每日技术总计/员工每日总计报告”
- 或查找和这样的元素:'revit_form_Button_'+'mininumnumber' 并具有磁贴:“每日技术总计/每日技术总计/员工每日总计报告”
任何方法都会极大地帮助我。
我的前两次失败的尝试:
browser.find_element_by_xpath("//*[starts-with(@id,'revit_form_Button_' ) and ends-with(@id,'0')]").click()
browser.find_element_by_xpath("//*[boolean(number(substring-before(substring-after(@id, 'revit_form_Button_'), '0')))]").click()
<div id="reporting_grid_CellReportTitle_10" class="rptCellReportTitle" widgetid="reporting_grid_CellReportTitle_10">
<div dojoattachpoint="divReportTitle" class="rptCellReportTitleSpanNode"><span class="dijit dijitInline dijitReset revitButtonHideBackground revitButton" data-dojo-attach-point="focusNode,titleNode,stateNode" role="button" aria-labelledby="revit_form_Button_30_label" data-dojo-attach-event="ondijitclick:_onClick" tabindex="0" id="revit_form_Button_30" widgetid="revit_form_Button_30" style="position: relative; user-select: none;">
<span class="dijitReset revitIconNode dijitNoIcon" data-dojo-attach-point="iconNode" style="display: none;"></span>
<span class="dijitReset dijitButtonText" id="revit_form_Button_30_label" data-dojo-attach-point="containerNode" style="padding-left: 0px; text-transform: none;"><b>Daily Tech Totals / Daily Tech Totals / Employee Daily Totals Report</b></span>
<span class="dijitReset revitIconNode revitIconRightNode dijitNoIcon" data-dojo-attach-point="iconRightNode"></span>
<input type="button" value="" class="dijitOffScreen" tabindex="-1" role="presentation" data-dojo-attach-point="valueNode">
</span></div>
<div dojoattachpoint="divNotes" class="rptCellReportTitleNotesNode"></div>
<div dojoattachpoint="divSchedule" class="rptCellReportTitleScheduleNode"></div>
</div>
<div id="reporting_grid_CellReportTitle_11" class="rptCellReportTitle" widgetid="reporting_grid_CellReportTitle_11">
<div dojoattachpoint="divReportTitle" class="rptCellReportTitleSpanNode"><span class="dijit dijitInline dijitReset revitButton revitButtonHideBackground" data-dojo-attach-point="focusNode,titleNode,stateNode" role="button" aria-labelledby="revit_form_Button_31_label" data-dojo-attach-event="ondijitclick:_onClick" tabindex="0" id="revit_form_Button_31" widgetid="revit_form_Button_31" style="position: relative; user-select: none;">
<span class="dijitReset revitIconNode dijitNoIcon" data-dojo-attach-point="iconNode" style="display: none;"></span>
<span class="dijitReset dijitButtonText" id="revit_form_Button_31_label" data-dojo-attach-point="containerNode" style="padding-left: 0px; text-transform: none;"><b>Daily Tech Totals / Daily Tech Totals / Employee Daily Totals Report</b></span>
<span class="dijitReset revitIconNode revitIconRightNode dijitNoIcon" data-dojo-attach-point="iconRightNode"></span>
<input type="button" value="" class="dijitOffScreen" tabindex="-1" role="presentation" data-dojo-attach-point="valueNode">
</span></div>
<div dojoattachpoint="divNotes" class="rptCellReportTitleNotesNode"></div>
<div dojoattachpoint="divSchedule" class="rptCellReportTitleScheduleNode"></div>
</div>
解决方案
XPath 1.0中没有ends-with
,但您可以使用
"//*[starts-with(@id,'revit_form_Button_' ) and substring(@id,string-length(@id)) = '0']"
满足附加条件
并且还有标题“每日技术总计/每日技术总计/员工每日总计报告”
添加一个像
child::*[text() = 'full content of the child element here']
或者
child::*[contains(text(),'text to match here')]
到您的 XPath。在您的示例中,子元素是<b>
. 所以,你也可以写child::b
而不是child::*
.
把它们放在一起:
"//*[starts-with(@id,'revit_form_Button_')
and substring(@id,string-length(@id)) = '0'
and child::*[text() = 'Daily Tech Totals / Daily Tech Totals / Employee Daily Totals Report']
]"
这是一个单一的 XPath 表达式。为了便于阅读,分成几行,但可以是一行。
推荐阅读
- python - 不和谐.py | 当机器人离开时,被踢,被服务器禁止
- python - WebScrape 所有相关的 URL/Hrefs
- html - Wordpress 页面标题中的斜体导致浏览器中出现奇怪的 HTML
- maven - AWS CodeCommit 和 Maven 发布插件
- json - json 算不算数据结构?如果不是,那么 JSON 的本质是什么?
- android - issue with addOnCompleteListener solved! -> running into W/System: Ignoring header X-Firebase-Locale because its value was null
- docker - 模拟 docker 节点之间的网络延迟
- android - 为整个屏幕设置 onClickListener
- db2-luw - DB2 LUW 数据库中的 JSON 查询执行语法错误
- vue.js - Vue.js 实现路由器