如何评估 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 中实现?
我认为您可以获得 href
和 ariaLabel
属性 值,例如
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
是否允许直接属性节点甚至字符串值选择,文档只讨论元素句柄。
这是我的代码,其中我获得了一些目标 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 中实现?
我认为您可以获得 href
和 ariaLabel
属性 值,例如
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
是否允许直接属性节点甚至字符串值选择,文档只讨论元素句柄。