在Puppeteer中获取所有带有XPath的链接(暂停或不工作)



我需要使用XPaths来选择页面上的所有链接,然后我的Puppeter应用程序才能点击并执行一些操作。我发现这个方法(下面的代码(有时会被卡住,我的爬网程序会被暂停。有没有更好/不同的方法从XPath获取所有链接?或者我的代码中有什么不正确的地方,可能会暂停我的应用程序的进度?

try {
links = await this.getLinksFromXPathSelector(state);
} catch (e) {
console.log("error getting links");
return {...state, error: e};
}

哪个调用:

async getLinksFromXPathSelector(state) {
const newPage = state.page
// console.log('links selector');
const links = await newPage.evaluate((mySelector) => {
let results = [];
let query = document.evaluate(mySelector,
document,
null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
for (let i=0, length=query.snapshotLength; i<length; ++i) {
results.push(query.snapshotItem(i).href);
}
return results;
}, state.linksSelector);
return links;
}

XPath位于state.linksSelector中。

您可以使用page.$x()来计算XPath表达式并获得ElementHandle数组。预先使用page.waitForXPath()以确保将XPath字符串指定的元素添加到DOM中可能是合适的。

然后,您可以通过page.evaluate()ElementHandle数组元素传递到页面上下文,并返回一个包含每个元素的href属性值的数组。

const xpath_expression = '//a[@href]';
await page.waitForXPath(xpath_expression);
const links = await page.$x(xpath_expression);
const link_urls = await page.evaluate((...links) => {
return links.map(e => e.href);
}, ...links);
console.log(link_urls);

最新更新