javascript - 将在 jsdom 承诺中生成的字符串分配给变量
问题描述
我正在使用 jsdom 来解析谷歌购物的结果。以下代码获取一个 google 购物链接,对其进行解析,并提取包含所有结果的表:
const jsdom = require('jsdom').JSDOM;
function parseSite() {
const url = "https://www.google.com/shopping/product/8352592323560827089/online";
let trimmedTable = "";
jsdom.fromURL(url).then(function (dom) {
let innerHtml = dom.window.document.querySelector('html').innerHTML;
let tableStartIndex = innerHtml.search("<tbody><tr ");
let nonTrimmedTable = innerHtml.substr(tableStartIndex + 7, innerHtml.length);
let tableEndIndex = nonTrimmedTable.search("</tbody></table>");
trimmedTable = nonTrimmedTable.substr(0, tableEndIndex);
});
}
parseSite();
我意识到 Promise 是异步的,似乎我正在尝试以同步方式使用它,但 jsdom 是我能找到的唯一可以加载整个网页的东西,就好像它是一个网络浏览器一样。我不想使用硒,因为性能会受到影响。代码本身完全按照我的意愿工作,我只需要得到trimmedTable
承诺之外的结果。
我的问题:有没有比 jsdom 更好的东西来从网页加载和提取数据,就好像它们被加载到浏览器中一样?(可以完成我在提供的代码中尝试做的事情)如果没有,我该如何编写我的代码,以便我可以获得trimmedTable
分配给承诺之外的变量的结果?
解决方案
我能够通过使用结合 Promise.all() 的异步函数来解决我的问题。
使用 Promise.all() 的好处是我可以创建多个异步函数,然后将这些函数中的 Promise 返回的所有值放入一个函数中。然后,我可以将这些值分配给一个变量并根据需要处理它们。这是我现在的代码:
let retailers = async function parseRetailers() {
const webPage = await jsdom.fromURL("https://www.google.com/shopping/product/8352592323560827089");
let innerHtml = webPage.window.document.querySelector('html').innerHTML;
let tableStartIndex = innerHtml.search("<tbody><tr "); //len=7
let nonTrimmedTable = innerHtml.substr(tableStartIndex + 7, innerHtml.length);
let tableEndIndex = nonTrimmedTable.search("</tbody></table>");
return nonTrimmedTable.substr(0, tableEndIndex);
}
let allRetailers = [];
Promise.all([retailers()])
.then(values => {
allRetailers = values;
});
推荐阅读
- python - 当我更改变量的值时,我总是需要重新启动内核
- javascript - 引导选择选择器选项始终处于选中状态
- jenkins - 詹金斯/凹槽 - 显示所有阶段失败的动态阶段
- join - 有没有比在 Proc SQL 中使用一对多连接更快的方法来生成所需的输出?
- wpf - Form.Closing 事件
- ansible - Ansible:从属性文件中读取变量
- php - 根据登录用户更改语言
- r - GGPLOT - 显示跨年级和年份的年度入学连接
- node.js - office-js + outlook-web-addins + Webpack + 生产
- flutter - Flutter 中的 NaN 是什么,是由什么引起的?