ブラウザ側で生成保持しているNodeListをnodejs側にそのまま持ってきていじることはできないのでは?
textContentやinnerHTMLなど文字列なら渡せますし、ドキュメント読むとJSONにして取得するメソッドもあるようですよ。
解決方法としてはevaluateの中でやりたいこと(詳しくは知りませんが。)すべて終わらせてから文字列で返すとか・・・
JavaScript
1 const children0Html = await page.evaluate(() => {
2 const items = document.querySelectorAll('.resultitem');
3 return items[0].children[0].innerHTML;
4 });
5 console.log(children0Html);
ElementHandleを使って、
JavaScript
1 const items = await page.$$('.resultitem');
2 const children0Html = await page.evaluate(item => {
3 return item.children[0].innerHTML;
4 }, items[0]);
5 console.log(children0Html);
とか、
JavaScript
1 const items = await page.$$('.resultitem');
2 const items0Html = await page.evaluate(item => item.innerHTML, items[0]);
3 console.log(items0Html);
4 const children = await items[0].$$('*');
5 const children0Html = await page.evaluate(child => child.innerHTML, children[0]);
6 console.log(children0Html);
等になるのでしょうか。
しかしやりたいことはブラウザ操作ではなくDOMを解析してquerySelectorで特定の情報を抜き出すことなのですよね?
でしたら私だったらnpm i
<消えたのでここから続き>
でしたら私だったらnpm install jsdomして、chromeにDOM構築させてから文字列で受け取ってあとはnode側でJSDOM使って処理します。以下のように(urlは変えてくださいね)
JavaScript
1const { JSDOM } = require('jsdom');
2const puppeteer = require('puppeteer');
3(async () => {
4 const browser = await puppeteer.launch();
5 const page = await browser.newPage();
6 await page.goto('https://example.com/');
7 await page.waitForSelector('.resultitem');
8 const html = await page.evaluate(() => document.documentElement.outerHTML);
9 browser.close();
10
11 const document = new JSDOM(html).window.document;
12 const items = document.querySelectorAll('.resultitem');
13 console.log(items[0].children);
14})();
更にnpm install jqueryして以下のようにするとjQueryも使えますよ。
JavaScript
1const { JSDOM } = require('jsdom');
2const puppeteer = require('puppeteer');
3(async () => {
4 const browser = await puppeteer.launch();
5 const page = await browser.newPage();
6 await page.goto('https://example.com/');
7 await page.waitForSelector('.resultitem');
8 const html = await page.evaluate(() => document.documentElement.outerHTML);
9 browser.close();
10
11 const window = new JSDOM(html).window;
12 const document = window.document;
13 const $ = require('jquery')(window);
14
15 const $items = $('.resultitem');
16 console.log($items.children());
17})();
いつもクライアント側でやるのと同じように書けて分かりやすくないでしょうか?
お求めの答えかは分かりませんが、参考になりましたら幸いです。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/02/19 05:10
2019/02/19 06:12
2019/02/19 16:45
2019/02/20 01:39
2019/02/20 17:48