【问题标题】:Get first element Xpath获取第一个元素 Xpath
【发布时间】:2022-08-17 04:03:41
【问题描述】:

我有一个这样的 HTML:

<ol class=\"list\">
   <li class=\"list-item \" id=\"37647629\">
      <!---->
      <div>
         <!---->
         <div>
            <!---->
            <book class=\"book\">
              <div class=\"title\">
                 someText
              </div>    
              <div class=\"year\">
                 2022
              </div>               
            </book>
         </div>
         <!---->         
      </div>
      <!---->
   </li>
   <li class=\"list-item \" id=\"37647778\">
      <!---->
      <div>
         <!---->
         <div>
            <!---->
            <book class=\"book\">
              <div class=\"title\">
                 someOtherText
              </div>    
              <div class=\"year\">
                 2014
              </div>            
            </book>
         </div>
      </div>
      <!---->
   </li>   
</ol>

我想得到第一本书的书名和年份,直接用两个xPath表达式。 我试过了 :

$x(\'//book\') => Ok, get the two books list

$x(\'//book[0]\') => Empty list    

$x(\'//book[0]/div[@class=\"title\"]\') => Nothing

似乎我必须这样做:

$x(\'//book\')[0]

然后处理标题,但是为什么我不能只使用 Xpath 来执行此操作并使用 Xpath 表达式直接访问第一个标题?

  • (//book)[1] 作为 xpath 有什么问题?
  • 没什么,我只是有点累,看不出它本身可能是一个 xpath 表达式,我认为 //book 是 xpath 而 [1] 是 JavaScript 之后;)

标签: node.js xml xpath puppeteer


【解决方案1】:

这将为您提供第一本书的标题

"(//book)[1]//div[@class='title']"

这给出了第一本书的年份

"(//book)[1]//div[@class='year']"

【讨论】:

    【解决方案2】:

    您错过了从 1 开始的 XPath 索引; JavaScript 索引从0 开始。

    • $x('//book') 选择文档中的所有 book 元素:
    • $x('//book[0]') 什么都不选择,因为 XPath 索引从 1 开始。
      • $x('//book')[0] 选择第一个 book 元素,因为 JavaScript 索引从 0 开始。

    要在 XPath 中选择第一个 divclass'title all:

    $x('(//div[@class="title"])[1]')
    

    或者,使用 JavaScript 索引:

    $x('(//div[@class="title"])')[0]
    

    要仅返回不带前导/尾随空格的字符串值,请使用 normalize-space()

    $x('normalize-space((//div[@class="title"])[1])')
    

    请注意,normalize-space() 也将合并内部空格,但这在本示例中无关紧要。

    也可以看看

    【讨论】:

      猜你喜欢
      • 2011-08-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多