我需要使用 XPath 选择页面上的所有链接,然后我的 Puppeteer 应用程序才能单击并执行一些操作。我发现该方法(下面的代码)有时会卡住,我的爬虫会暂停。是否有更好/不同的方式从 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() https://github.com/GoogleChrome/puppeteer/blob/master/docs/api.md#pagexexpression计算 XPath 表达式并获得ElementHandle https://github.com/GoogleChrome/puppeteer/blob/master/docs/api.md#class-elementhandle大批。可能适合使用page.waitForXPath() https://github.com/GoogleChrome/puppeteer/blob/master/docs/api.md#pagewaitforxpathxpath-options事先确保将 XPath 字符串指定的元素添加到 DOM 中。
然后你就可以通过ElementHandle https://github.com/GoogleChrome/puppeteer/blob/master/docs/api.md#class-elementhandle数组元素通过page.evaluate() https://github.com/GoogleChrome/puppeteer/blob/master/docs/api.md#pageevaluatepagefunction-args并返回一个包含以下内容的数组href https://developer.mozilla.org/en-US/docs/Web/HTML/Element/a#attr-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);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)