如何评估 Puppeteer 中另一个 XPath 中的相对 XPath?

How to evaluate a relative XPath inside another XPath in Puppeteer?

这是我的代码,其中我获得了一些目标 div 的元素句柄

const puppeteer = require("puppeteer");


(async () => {
const searchString = `https://www.google.com/maps/search/restaurants/@-6.4775265,112.057849,3.67z`;


const browser = await puppeteer.launch();

const page = await browser.newPage();
await page.goto(searchString);

const xpath_expression ='//div[contains(@aria-label, "Results for")]/div/div[./a]';

await page.waitForXPath(xpath_expression);
const targetDivs = await page.$x(xpath_expression);

// const link_urls = await page.evaluate((...targetDivs) => {
//   return targetDivs.map((e) => {
//     return e.textContent;
//   });
// }, ...targetDivs);

})();

我在这些包含相关数据的目标 Div 中有两个相对的 XPath 链接

'link' : './a/@href'
'title': './a/@aria-label'

我有一个类似的 python 代码示例

from parsel import Selector

response = Selector(page_content)

results = []

for el in response.xpath('//div[contains(@aria-label, "Results for")]/div/div[./a]'):
    results.append({
        'link': el.xpath('./a/@href').extract_first(''),
        'title': el.xpath('./a/@aria-label').extract_first('')
    })

如何在 puppeteer 中实现?

我认为您可以获得 hrefariaLabel 属性 值,例如

   const targetDivs = await page.$x(xpath_expression);

   targetDivs.forEach(async (div, pos) => { 
     const links = await div.$x('a[@href]'); 
     const href = await (await links[0].getProperty('href')).jsonValue();
     const ariaLabel = await (await links[0].getProperty('ariaLabel')).jsonValue(); 
     console.log(pos, href, ariaLabel);
   });

这些是元素属性,而不是属性值,在 href 的情况下,这可能意味着您得到的是绝对值而不是相对值 URL 但我没有检查该特定页面是否有所作为。我不确定 $x 是否允许直接属性节点甚至字符串值选择,文档只讨论元素句柄。