質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
87.20%
スクレイピング

スクレイピングとは、公開されているWebサイトからページ内の情報を抽出する技術です。

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

解決済

puppeteerでの文字列の取得

laplade
laplade

総合スコア14

スクレイピング

スクレイピングとは、公開されているWebサイトからページ内の情報を抽出する技術です。

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

1回答

0評価

1クリップ

217閲覧

投稿2022/05/08 06:39

前提

puppeteer、JavaScriptを使用する。

実現したいこと

例えばカンマ区切り等で
"abc,defg,hi"
"j,k,lm"
"n,op,qr"
のように取得したい。

発生している問題・エラーメッセージ

以下のようなDOMをpuppeteerでスクレイピングしたところ、

html

<tbody id="id-name"> <tr> <td id="id_a_0" class="class-name">abc</td> <td id="id_b_0" class="class-name">defg</td> <td id="id_c_0" class="class-name">hi</td> </tr> <tr> <td id="id_a_1" class="class-name">j</td> <td id="id_b_1" class="class-name">k</td> <td id="id_c_1" class="class-name">lm</td> </tr> <tr> <td id="id_a_2" class="class-name">n</td> <td id="id_b_2" class="class-name">op</td> <td id="id_c_2" class="class-name">qr</td> </tr> </tbody>

"abcdefghi"
"jklm"
"nopqr"

のように文字列が連結されてしまいます。

該当のソースコード

index.js

javascript

import module from 'module'; const require = module.createRequire(import.meta.url); const pModule = '../NodeModule/puppeteer@13.7.0/node_modules/puppeteer'; const puppeteer = require(pModule); const isDebug = true; (async () => { const url = 'https://www.XXXXXXXXXXXXXXXXXXXXXXX/'; const browser = await puppeteer.launch({ headless: !isDebug, devtools: isDebug, args: [ "--disable-gpu", "--no-sandbox", "--disable-setuid-sandbox", "--no-first-run", "--no-zygote", "--single-process", "--disable-dev-shm-usage", ], }); const pages = await browser.pages(); await pages[0].goto(url); let data = await pages[0].$$eval('#id-name > tr', item => { return item.map(data => data.textContent); }); console.log(data[0]); console.log(data[1]); console.log(data[2]); await browser.close(); })();

試したこと

最後の「await browser.close();」の前に以下のソースを足すことで、1つ1つidを指定して個々の文字列を取得することはできました。
もっとスマートにやる方法はないでしょうか。

javascript

let values= []; for (let i = 0; i < data.length; i++) { values.push({ a: await pages[0].$eval('#id-name > tr > #id_a_' + i.toString(), item => { return item.textContent; }), b: await pages[0].$eval('#id-name > tr > #id_b_' + i.toString(), item => { return item.textContent; }), c: await pages[0].$eval('#id-name > tr > #id_c_' + i.toString(), item => { return item.textContent; }), }); }

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

まだ回答がついていません

会員登録して回答してみよう

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
87.20%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

スクレイピング

スクレイピングとは、公開されているWebサイトからページ内の情報を抽出する技術です。

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。