集合中的 Xpath return 标记位置(包含文本)

Xpath return tag position (which contains text) in a set

我想 return 一组标签中包含选定文本的第一个标签的位置编号。

我想设置一个有 4 列的 google sheet :

1 : URL (https://www.castorama.fr/electricite/interrupteur-et-prise/interrupteur-et-prise-etanche/cat_id_4414.cat)

2:类别页面上的产品数量:

    =IMPORTXML($B4;"count(//p[@data-test-id='productTitle'])")

3 : 标题中包含“Legrand”或“Céliane with Netatmo”的产品数量:

    =IMPORTXML($B4;"count(//p[@data-test-id='productTitle'][contains(.,'Céliane with Netatmo')or contains(.,'Legrand')])")

上面的公式很好。我在第四个上遇到了困难:

4 : 标题中包含“Legrand”或“Céliane with Netatmo”的第一个产品的位置。

例如,第 2 列 returns 24(产品)和第 3 列 returns 12(产品)。 如果第一个产品是带有“Legrand”或“Céliane with Netatmo”的产品,我希望第 4 列为 return 1。如果它位于第 4 个位置,我希望它为 return 4.

我试过了

    =IMPORTXML($B4;"//div//p[@data-test-id='productTitle'][.='Legrand']/preceding-subling::*)+1")

但似乎我没有“//div//p”的正确顺序。我打赌它与子元素有关,在“/”之前,我一定没有正确选择标签。

他们真的把那个页面的数据藏得很深....

尝试(在此示例中使用“Céliane”;显然您可以进一步修改它):

=IMPORTXML($B4,"count((//li[@class='b9bdc658'][.//p[@data-test-id='productTitle'][contains(.,'Céliane')]])[1]/preceding-sibling::*)+1")

具有以下 XPath 的另一个选项(我们使用 () []preceding 轴):

=IMPORTXML(B4;"count((//p[@data-test-id='productTitle'][contains(.,'Céliane with Netatmo')or contains(.,'Legrand')])[1]/preceding::div[@data-test-id='product-panel'])+1")

输出:

为了安全起见(如果页面上没有罗格朗产品),E4中的公式应该是:

=IF(D4=0;"NA";IMPORTXML(B4;"count((//p[@data-test-id='productTitle'][contains(.,'Céliane with Netatmo')or contains(.,'Legrand')])[1]/preceding::div[@data-test-id='product-panel'])+1"))

Castorama pour ré-u-ssir !