Puppeteer:搜索内部文本不区分大小写

kur*_*tko 5 javascript xpath node.js web-scraping puppeteer

我正在尝试使用 puppeteer 搜索不区分大小写的内部文本。

我读过这个:case insensitive xpath contains() possible?

例如我有这个元素:

<div>
 <span>Test One</span>
 <span>Test Two</span>
 <span>Test Three</span>
</div>
Run Code Online (Sandbox Code Playgroud)

我尝试过这个但不成功:

const element = await page.$x("//span//text()[contains(translate(., 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'), 'two')]");
Run Code Online (Sandbox Code Playgroud)

Tho*_*orf 5

您的 XPath 表达式是有效的,但您返回的是text()节点本身而不是节点本身。page.$x期望 XPath 返回一个元素,因此您的代码不起作用。要返回节点,您需要查询 span 元素。

const element = await page.$x("//span[contains(translate(text(), 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'), 'two')]");
Run Code Online (Sandbox Code Playgroud)

请注意,这只text()适用于纯文本节点。如果您有混合内容(包含元素和文本),则应使用字符串值(.而不是text()):

const element = await page.$x("//span[contains(translate(., 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'), 'two')]");
Run Code Online (Sandbox Code Playgroud)

为了比较表达式,我将它们放在一起:

//span//text()[contains(translate(., 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'), 'two')]
//span[contains(translate(text(), 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'), 'two')
//span[contains(translate(., 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'), 'two')]
Run Code Online (Sandbox Code Playgroud)

第一个是跨度节点文本的表达式(由您给出)。第二个使用 查询节点本身text()。最后一个使用字符串值来查询节点。