Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/457.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 将jsdom承诺内生成的字符串分配给变量_Javascript_Node.js_Web Scraping_Promise_Jsdom - Fatal编程技术网

Javascript 将jsdom承诺内生成的字符串分配给变量

Javascript 将jsdom承诺内生成的字符串分配给变量,javascript,node.js,web-scraping,promise,jsdom,Javascript,Node.js,Web Scraping,Promise,Jsdom,我使用jsdom来解析google购物的结果。以下代码获取google购物链接,对其进行解析,并提取包含所有结果的表: const jsdom = require('jsdom').JSDOM; function parseSite() { const url = "https://www.google.com/shopping/product/8352592323560827089/online"; let trimmedTable = ""; js

我使用jsdom来解析google购物的结果。以下代码获取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();
constjsdom=require('jsdom').jsdom;
函数parseSite(){
常量url=”https://www.google.com/shopping/product/8352592323560827089/online";
让trimmedTable=“”;
fromURL(url).then(函数(dom){
让innerHtml=dom.window.document.querySelector('html').innerHtml;

让tableStartIndex=innerHtml.search(“我能够通过使用一个与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;
});
let retailers=异步函数parseRetailers(){
const webPage=等待jsdom.fromURL(“https://www.google.com/shopping/product/8352592323560827089");
让innerHtml=webPage.window.document.querySelector('html').innerHtml;

让tableStartIndex=innerHtml.search(“我能够通过使用一个与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;
});
let retailers=异步函数parseRetailers(){
const webPage=等待jsdom.fromURL(“https://www.google.com/shopping/product/8352592323560827089");
让innerHtml=webPage.window.document.querySelector('html').innerHtml;

让tableStartIndex=innerHtml.search("这回答了你的问题吗?请告诉我JSDOM不需要字符串处理HTML来抓取网页?@Roamer-1888我看到了这一点,但我不知道如何将其应用到我的场景中,因为我是web开发新手。它不需要字符串处理,我选择使用.innerHTML将HTML作为字符串获取。你应该这样做不需要字符串处理来查找DOM节点。请尝试使用CSS选择器“table”(正如您当前使用
.querySelector('html')
)查找该表,然后,如果需要该表的html,请获取其
.innerHTML
属性。但似乎不太可能真正需要该表的innerHTML。
parseSite()的调用者)
最好使用table节点,如果需要的话(可能不是),它可以从中提取innerHTML。您可能需要
dom.window.document.queryselectoral('table')[0]
dom.window.document.queryselectoral('table')[1]
这是否回答了您的问题?请告诉我JSDOM不需要字符串处理HTML来抓取网页?@Roamer-1888我看到了这一点,但我不知道如何将其应用到我的场景中,因为我是web开发新手。它不需要字符串处理,我选择使用.innerHTML.You将HTML作为字符串获取应该不需要字符串处理来查找DOM节点。尝试使用CSS选择器“table”查找该表(正如您当前使用
.querySelector('html')
),然后,如果您需要该表的html,请获取其
.innerHTML
属性。但似乎不太可能真正需要该表的innerHTML。
parseSite()的调用方
最好使用table节点,如果需要的话(可能不是),它可以从中提取innerHTML。您可能需要
dom.window.document.queryselectoral('table')[0]
dom.window.document.queryselectoral('table')[1]