【问题标题】:XPath that selects table cells using wildcard使用通配符选择表格单元格的 XPath
【发布时间】:2018-09-30 12:42:56
【问题描述】:

我正在编写一个 XPath,它以 HTML 表中的 TD 单元格为目标。它的编写方式是,我可以选择一行中的所有单元格,选择一列中的所有单元格,或者通过为行或列提供通配符来选择单个单元格。

XPath:

//*[@id='myGrid']/div/table/tbody/tr[{index0}]/td[{index1}]

案例:

选择第一行:
index0 = 1 index1 = * (BROKEN)

选择第一列:
index0 = * index1 = 1(有效)

选择左上角的单元格:
index0 = 1 index1 = 1(有效)

第一种情况是省略某些 TD(黄色单元格表示 XPath 选择):

部门的 HTML 结构显示某些 TD 不包含“跨度”。不知道为什么这会阻止选择 TD,因为 XPath 以 TD 为目标。

【问题讨论】:

    标签: html xpath web


    【解决方案1】:

    在 XPath 中,tr[*]not 表示 any 索引处的 tr;这意味着带有任何子元素的tr

    要选择tr 元素而不考虑索引位置,请完全省略[*] 谓词。

    类似的推理也适用于td[*]

    【讨论】:

      【解决方案2】:

      我发现通过使用句点作为通配符,XPath 可以适当地选择所有分区。最终的 xpath:

      选择第一行中的所有单元格:
      //*[@id='myGrid']/div/table/tbody/tr[1]/td[.]

      选择第一列中的所有单元格:
      //*[@id='myGrid']/div/table/tbody/tr[.]/td[1]

      选择左上角的单元格:
      //*[@id='myGrid']/div/table/tbody/tr[1]/td[1]

      XPath Syntax

      【讨论】:

      • 您已经从一种误解(tr[*] 表示所有tr)转变为另一种(tr[.] 表示所有tr)并忽略了如何选择所有@ 的实际解释987654330@(或td)元素。如果您放弃多余的[.] 谓词并仅使用trtd 来处理所有此类元素as I already recommended but you chose to ignore,您将有一个更清洁的解决方案。理解这些概念,尤其是直接展示它们时,而不是仅仅通过反复试验来猜测。
      猜你喜欢
      • 1970-01-01
      • 2013-05-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多