Javascript 在Puppeter中使用XPath获取所有链接(暂停或不工作)?
我需要使用XPath来选择页面上的所有链接,然后我的木偶应用程序才能点击进入并执行一些操作。我发现这个方法(下面的代码)有时会卡住,我的爬虫程序会暂停。是否有更好/不同的方法从XPath获取所有链接?或者我的代码中是否有不正确的地方,可能会暂停我的应用程序的进程Javascript 在Puppeter中使用XPath获取所有链接(暂停或不工作)?,javascript,node.js,xpath,google-chrome-devtools,puppeteer,Javascript,Node.js,Xpath,Google Chrome Devtools,Puppeteer,我需要使用XPath来选择页面上的所有链接,然后我的木偶应用程序才能点击进入并执行一些操作。我发现这个方法(下面的代码)有时会卡住,我的爬虫程序会暂停。是否有更好/不同的方法从XPath获取所有链接?或者我的代码中是否有不正确的地方,可能会暂停我的应用程序的进程 try { links = await this.getLinksFromXPathSelector(state); } catch (e) { console.log("error getting links"); ret
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;
}
异步getLinksFromXPathSelector(状态){
const newPage=state.page
//log('links selector');
const links=wait newPage.evaluate((mySelector)=>{
让结果=[];
让query=document.evaluate(mySelector,
文件,
null,XPathResult.ORDERED\u节点\u快照\u类型,null);
对于(设i=0,length=query.snapshotLength;i),您可以使用来计算XPath表达式并获取数组。事先使用可以确保将XPath字符串指定的元素添加到DOM中
然后可以通过将数组元素传递到页面上下文,并返回一个包含每个元素的属性值的数组
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);
这段代码绝对更干净,更容易阅读。谢谢你,但是,程序仍然被困在这个方法中-并且只在生产环境中,这是在一个停靠的容器中仅供参考。原来主要的问题是上游,但这段代码肯定有帮助。谢谢!