const puppeteer = require('puppeteer');
(async () => {
const browser = await puppeteer.launch();
const options = ["iframe"]
const url = 'https://www.loungeincomfort.com.au/'
const page = await browser.newPage();
await page.goto(url);
for (var i = 0; i < options.length; i++) {
const frame = await page.$$eval(options[i], e => e.map(a => {
const attrs = a.getAttributeNames();
const len = attrs.length;
const test = {};
for (var i = 0; i < len; i++) {
//test[attrs[i]].push({ label: "Hello World" })
test[attrs[i]] = a.getAttribute(attrs[i])
}
return test;
}))
console.info(frame);
}
await browser.close();
})();
вывод такой:
[
{
"width": "640",
"height": "360",
"src": "https://www.youtube.com/embed/ZJPsDBCD4XU",
"frameborder": "0",
"allow": "accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture",
"allowfullscreen": ""
}
]
Я хочу добавить к выводу параметры [i] и URL-адрес, который я добавил в свой код.
const test = {
"object": options[i],
"page": url
};
но я получаю сообщение об ошибке, что параметры не определены, и я получаю ту же ошибку с URL-адресом, если я удалил «объект»: параметры [i],
Что мне делать, чтобы устранить эту ошибку?
Итак, у меня есть еще одна проблема в моем выходе
вывод такой:
[{
"width": "1170",
"height": "490",
"style": "visibility: visible; width: 100%; margin-left: 0px; height: 301.538px; margin-top: -3.26923px; position: absolute;"
}]
Я хочу разделить вывод стиля на объекты, чтобы они были такими
Я провел некоторое исследование по этому поводу и не нашел ничего полезного
[{
"width": "1170",
"height": "490",
"style": {
"visibility": "visible",
"width": "100%",
"margin-left": "0px",
"height": "301.538px",
"margin-top": "-3.26923px",
"position": "absolute"
}}]
Заранее спасибо :)
Код, к которому вы пытаетесь добавить options[i]
, — это клиентский код, который Puppeteer запускает в автономном браузере («функция страницы»). options
там не существует.
Согласно документации, Puppeteer может передать это значение функции страницы в качестве аргумента, поэтому:
const frame = await page.$$eval(options[i], (e, object, page) => e.map(a => {
// ^ ^^^^^^^^^^^^^^
const attrs = a.getAttributeNames();
const len = attrs.length;
const test = {object, page};
// ^^^^^^^^^^^^
for (var i = 0; i < len; i++) {
//test[attrs[i]].push({ label: "Hello World" })
test[attrs[i]] = a.getAttribute(attrs[i])
}
return test;
}), options[i], url)
// ^^^^^^^^^^^^^^^^^
@MohamedEssam - ваше редактирование задает совершенно другой вопрос. Пожалуйста, разместите это как отдельный вопрос. (Короткий ответ: перебирать свойства свойства style
элемента [a.style
], а не смотреть строку в атрибуте style
[a.getAttribute(...)
].)
Это должно решить вашу проблему:
const browser = await puppeteer.launch();
const options = ["iframe"];
const url = "https://www.loungeincomfort.com.au/";
const page = await browser.newPage();
await page.goto(url);
for (var i = 0; i < options.length; i++) {
const object = options[i];
const frame = await page.$$eval(
options[i],
(e, { url, object }) =>
e.map((a) => {
const attrs = a.getAttributeNames();
const len = attrs.length;
const test = { object, page: url };
for (var i = 0; i < len; i++) {
//test[attrs[i]].push({ label: "Hello World" })
test[attrs[i]] = a.getAttribute(attrs[i]);
}
return test;
}),
{ url, object }
);
console.info(frame);
}
await browser.close();
Объяснение: передать URL и объект в качестве дополнительных аргументов $$eval
Я обновил свой вопрос, можете ли вы взглянуть и посмотреть, сможете ли вы мне помочь?