本文编写于 281 天前,最后修改于 281 天前,其中某些信息可能已经过时。

Selenium Xpath定位唯一文本元素

问题概述

现有一网页,已知唯一文本元素a,需要定位父级的同级元素b并抓取文本b.text,如何实现

给出案例

<tr title="本次发行的可转债向发行人在股权登记日(2021年12月24日,T-1日)收市后中国结算上海分公司登记在册的原股东优先配售,原股东优先配售后余额部分(含原股东放弃优先配售部分)采用网上通过上交所交易系统向社会公众投资者发售的方式进行,余额由保荐机构(主承销商)包销。" data-index="1">
  <td style="width:  60px; " class="">110084</td>
  <td style="width:  60px; " class="">贵燃转债</td>
  <td style="width:  60px; " class="">
    <a class="red" href="/kzz/detail/110084.html">详细</a>&nbsp;
    <a href="//guba.eastmoney.com/list,sh110084.html">股吧</a>
  </td>
  <td class="nowrap desc_col" style="width:  110px; ">2021-12-27 周一</td>
  <td style="width:  60px; " class="">733903</td>
  <td style="width:  70px; " class="">100</td>
  <td style="width:  60px; " class="">
    <a href="......">600903</a>
  </td>
  <td style="width:  60px; " class="">
    <a href="/stockdata/600903.html">贵州燃气</a>
  </td>
  <td style="width:  60px; " class="">10.09</td>
  <td style="width:  60px; " class="">10.17</td>
  <td style="width:  70px; " class="">99.21</td>
  <td style="width:  60px; " class="">100.00</td>
  <td style="width:  60px; " class="">
    <span class="red">0.79%</span>
  </td>
  <td style="width:  55px; " class="">
    <span title="2021-12-24">12-24</span>
  </td>
  <td style="width:  55px; " class="">0.8780</td>
  <td style="width:  65px; " class="">10.00</td>
  <td style="width:  60px; " class="">
    <span title="2021-12-29">12-29</span>
  </td>
  <td style="width:  50px; " class="">-</td>
  <td style="width:  50px; " class="">
    <span title="-">-</span>
  </td>
</tr>

已知唯一元素为正股代码600903,即<a href="......">600903</a>,需要定位并抓取外层的第n个同级元素,包括<td style="width: 60px; " class="">10.09</td><span class="red">0.79%</span>

解决方法

通过selenium xpath的文本查询来实现定位,再通过父元素的同级查询来定位对应文本

# python selenium
xpath1 = '//a[text()=600903]/parent::*/following-sibling::*[2]'
stock_price = driver.find_element_by_xpath(xpath1).text
# 输出10.09
xpath2 = '//a[text()=600903]/parent::*/following-sibling::*[6]'
premium = driver.find_element_by_xpath(xpath2).text
# 输出0.79%

其中//a[text()=600903]是定位文本,/parent::*定位父元素,/following-sibling::*[n]则是用来定位之后第n个元素

附录

XPath轴(XPath Axes)可定义某个相对于当前节点的节点集:

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

例子

获取父级:

response.xpath('//*[@class="ALink"]/parent::*')

获取后面同级第一个元素

response.xpath('//*[@class="ALink"]/following-sibling::*[1]')

获取 a 标签中含有 rsjfont8 样式的

response.xpath('//a[@class="rsjfont8"]')

获取 a 标签中除去 rsjfont8 样式的

response.xpath('//a[not(@class="rsjfont8")]')

参考

  1. XPath轴定位(轴和步)

  2. xpath 获取父级,和同级