计算在XPath中按其@class属性名称分组的HTML标记

时间:2017-10-17 15:15:04

标签: html xpath

我需要一个XPath表达式,它计算具有起始类属性字符串的所有<tr>行:room_loop_counter按其属性名称本身分组。 我有以下示例HTML代码从中提取数据:

<tbody id="container" >
   <tr class="room_loop_counter1 maintr">
      <td class="legibility " rowspan="6"></td>
      <td colspan="4" style="padding:0;"></td>
   </tr>
   <tr class="room_loop_counter1">
      <td ></td>
      <td class=""></td>
   </tr>
   <tr class="room_loop_counter1"></tr>
   <tr class="room_loop_counter2 maintr divider"></tr>
   <tr class="room_loop_counter2"></tr>
   <tr class="room_loop_counter3 maintr divider"></tr>
   <tr class="room_loop_counter3"></tr>
   <tr class="room_loop_counter3"></tr>
   <tr class="room_loop_counter3"></tr>
   <tr class="room_loop_counter3"></tr>
</tbody>

鉴于上述HTML,我希望获得结果: 2,1,4 计数是元素的数量减去1,因为我想从计数中丢弃第一个<tr>maintr的那个)作为标题...

<tr>元素之间可能存在其他<tr>元素,因此它们并非严格依次,因此我们不能依赖于后续或前面的兄弟逻辑。

我已尝试使用以下XPath表达式:

count(//table[@id="maxotel_rooms"]/tbody/tr[@class=distinct-values(//table[@id="maxotel_rooms"]/tbody/tr[starts-with(@class, "room_loop_counter") and not(contains(@class, "maintr"))]/@class)]/@class])

但它并不适用于chrome(在控制台窗口上使用$x('')进行评估),因为它无法识别distinct-values函数。 你能建议一个可能的解决方案?什么是最好的方法?

1 个答案:

答案 0 :(得分:1)

检查此XPath是否有唯一的tr,其中类开头是一些数据,而不是其他类名。

  

// tbody / tr [starts-with(@class,“room_loop_counter”)而不是(包含(@class,“maintr”))] / following :: tr [not(./@ class = following :: tr / @ class)而不是(contains(@class,“maintr”))]

使用Javascript:

var path = "//body/div";
var uniquePathCount = window.document.evaluate('count(' + path + ')', window.document, null, 0, null);
console.log( uniquePathCount );
console.log( uniquePathCount.numberValue );

输出继电器:

<tr class="room_loop_counter1"/>
<tr class="room_loop_counter2"/>
<tr class="room_loop_counter3"/>