Java Playwright中通过ElementHandle获取指定后续兄弟元素问题
Puppeteer获取指定ElementHandle的第N个后续元素兄弟(模拟JSoup的nextElementSibling)
问题根源:你用的
nextSibling会获取所有类型的兄弟节点(包括文本节点、注释节点),而非仅元素节点,链式调用大概率拿到的不是DOM元素,导致asElement()返回null,最终获取内容为空。直接获取下一个元素兄弟(对应JSoup的
nextElementSibling()):
利用浏览器原生的nextElementSiblingAPI,直接在页面上下文调用:// 获取下一个元素兄弟节点 const nextElement = await elementHandle.evaluateHandle(element => element.nextElementSibling); if (nextElement.asElement()) { const content = await nextElement.asElement().evaluate(el => el.innerHTML); console.log(content); }也可以直接获取内容,省略单独拿节点的步骤:
const content = await elementHandle.evaluate(element => element.nextElementSibling?.innerHTML || '');获取第N个后续元素兄弟:
写一个遍历函数在页面上下文里定位目标节点:// 获取第N个后续元素兄弟(N从1开始计数) const getNthNextElementSibling = async (elementHandle, n) => { return elementHandle.evaluate((element, targetN) => { let current = element.nextElementSibling; let count = 1; while (current && count < targetN) { current = current.nextElementSibling; count++; } return current; }, n); }; // 使用示例:获取第2个后续元素兄弟的内容 const secondNextElement = await getNthNextElementSibling(elementHandle, 2); if (secondNextElement) { console.log(secondNextElement.innerHTML); }原代码问题修正(不推荐,仅作理解参考):
如果一定要用getProperty,需要过滤非元素节点,但这种方式繁琐:let nextNode = await elementHandle.getProperty('nextSibling'); // 跳过非元素节点 while (nextNode.asElement() === null && nextNode) { nextNode = await nextNode.getProperty('nextSibling'); } if (nextNode.asElement()) { const content = await nextNode.asElement().evaluate(el => el.innerHTML); }
内容的提问来源于stack exchange,提问作者chiperortiz
相关产品推荐
相关产品推荐

