【问题标题】:Xpath return tag position (which contains text) in a setXpath 返回标签位置(包含文本)在集合中
【发布时间】:2020-07-09 17:20:57
【问题描述】:

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

我想设置一个 4 列的 google 表格:

1 : 网址 (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 列返回 24(产品),第 3 列返回 12(产品)。 如果第一个产品是带有“Legrand”或“Céliane with Netatmo”的产品,我希望第 4 列返回 1。如果它位于第 4 位,我希望它返回 4。

我试过了

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

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

【问题讨论】:

    标签: xpath web-scraping google-sheets google-sheets-importxml


    【解决方案1】:

    他们确实在那个页面上把数据隐藏得很深......

    试试(在这个例子中使用“Céliane”;显然你可以进一步修改它):

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

    【讨论】:

      【解决方案2】:

      具有以下 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 !

      【讨论】:

      • Axesome,它有效!我终于理解了标签顺序,现在可以在每个网站上做同样的事情了:)谢谢。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-30
      • 2015-03-03
      • 2017-01-04
      • 1970-01-01
      • 1970-01-01
      • 2014-06-01
      相关资源
      最近更新 更多