JavaScript Кукольник, очищающий переменную - PullRequest
1 голос
/ 16 марта 2020

Я пытаюсь очистить HTML данные из переменной, которая содержит HTML данных. Вы можете увидеть мои аннотации, они помечены знаком «<<». К сожалению, <code>evaluate работает только на странице, а не в div. Может ли кто-нибудь сказать мне, как я мог очистить информацию из переменной, содержащей HTML?

Возможно, есть другие методы очистки?

Я пробовал это в forEach l oop как хорошо, но это привело к появлению первого mealname исходного документа.

let mealName = htmlOfOneProduct.document.querySelector("div.meal__description-texts.js-meal-description-text > span > span").innerText;

Мой код с примечаниями:

const puppeteer = require('puppeteer');
function run () {
    return new Promise(async (resolve, reject) => {
        try {
            const browser = await puppeteer.launch();
            const page = await browser.newPage();
            await page.goto(" "); << Meal website
            let urls = await page.evaluate(() => {
                let results = [];
                let items = document.querySelectorAll('div.meal__wrapper'); << Gets all the meals from a page
                items.forEach((item) => {
                    let htmlOfOneProduct = item.innerHTML; << Gets the HTML of each meal

                    let mealName = htmlOfOne.evaluate(() => document.querySelector('meal-name').textContent); << Not working, should get the meal-name from the div.

                    results.push({
                        mealName: mealName
                    });
                });
                return results;
            })
            browser.close();
            return resolve(urls);
        } catch (e) {
            return reject(e);
        }
    })
}
run().then(console.log).catch(console.error);

Ответы [ 3 ]

2 голосов
/ 16 марта 2020

Возможно let htmlOfOneProduct = item.innerHTML; << Gets the HTML of each meal, в этом нет необходимости.

Если вам нужно только содержимое чего-то, что вы могли бы напрямую сделать item.innerText или item.name или любое другое свойство элемента.

В конце концов что-то вроде этого должно быть возможно:

items.forEach((item) => {    
   let mealName = item.querySelector('meal-name').innerText
   results.push({
        mealName: mealName
   });
});
2 голосов
/ 16 марта 2020

Поскольку вы не указали URL сайта, я не могу проверить свое предложение, извините.

item.innerHTML возвращает строку, для которой нет метода evaluate(). Попробуйте этот простой способ:

                items.forEach((item) => {
                    let mealName = item.querySelector('meal-name').textContent;
                    results.push({
                        mealName: mealName
                    });
                });
0 голосов
/ 18 марта 2020

Вы также можете комбинировать селекторы CSS и использовать Array.from(), чтобы упростить очистку innerText элементов:

let urls = await page.evaluate(() => {
  return Array.from(document.querySelectorAll('div.meal__wrapper span.meal-name'), e => ({
    mealName: e.innerText,
  });
});
...