首页 > 解决方案 > 即使指定了索引,XPath $x() 函数也会返回数组

问题描述

我正在尝试选择div包含"month-table_col"(按月选择)的标签。

...
<div class="month-table">
    <div class="month-table_row">
        <div class="month-table_col">Jan</div>
        <div class="month-table_col">Feb</div>
        <div class="month-table_col">Mar</div>
    </div>
    <div class="month-table_row">
        <div class="month-table_col">Apr</div>
        <div class="month-table_col">May</div>
        <div class="month-table_col">Jun</div>
    </div>
    <div class="month-table_row">
        <div class="month-table_col">Jul</div>
        <div class="month-table_col">Aug</div>
        <div class="month-table_col">Sep</div>
    </div>
    <div class="month-table_row">
        <div class="month-table_col">Oct</div>
        <div class="month-table_col">Nov</div>
        <div class="month-table_col">Dec</div>
    </div>
</div>
...

这是用于指定div标签的 XPath 代码,例如,选择div具有 11 月值的标签。

//div[contains(@class, 'month-table_col') and contains(text(), 'Nov')]

在 Google Chrome 控制台中运行以下命令后,

$x("//div[contains(@class, 'month-table_col') and contains(text(), 'Nov')]")

结果:它返回一个像这样的元素的数组

[div.month-table_col]
   0: div.month-table_col
   lastIndex:(...)
   lastItem:(...)
   length: 1
   __proto__:Array(0)

即使我尝试将索引指定为 1,它也会返回与上图相同的结果

$x("//div[contains(@class, 'month-table_col') and contains(text(), 'Nov')][1]")

返回的结果是正确的,但是如果无论如何我可以将元素作为标签,而不是数组结果。

预期结果:

<div class="month-table_col">Nov</div>

标签: htmlcssxmlxpathweb-scraping

解决方案


Chrome DevTools XPath 控制台函数,$x()始终返回一个数组,即使选择了单个节点,即使没有选择任何节点。

然后,您可以使用 JavaScript 索引来提取任何给定的数组元素。如果 XPath 的结果是单个节点,则追加[0]以从返回的数组中获取该节点:

$x("//div[contains(@class, 'month-table_col') and contains(text(), 'Nov')]")[0]

提醒: XPath 节点集和序列是从 1 开始的;JavaScript 数组是从 0 开始的。


推荐阅读