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

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

新規登録して質問してみよう
ただいま回答率
85.35%
Node.js

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

JavaScript

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

Q&A

解決済

1回答

2722閲覧

cheerio(Node.jsのライブラリ)を使ったスクレイピングで検索結果のタイトルが取得できない

moimoi_sushi

総合スコア26

Node.js

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

JavaScript

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

0グッド

1クリップ

投稿2020/04/26 09:41

前提・実現したいこと

検索エンジンduckduckGoの検索結果のタイトル一覧(URLも一緒に)をcheerioで取得したいです。

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

まずはタイトルを取得したいのですが、idやクラスを指定しても空白が返ってきてしまいます。

該当のソースコード

JavaScript

1const client = require('cheerio-httpcli'); 2const keyword = "テスト"; 3const targetURL = 'http://duckduckgo.com/'; 4 5client.fetch(targetURL, { q: keyword }) 6 .then((result) => { 7 result.$('#links').each(function (idx, elm) { 8       console.log( result.$(this).find('h2').text() ); 9       console.log(elm); 10 }); 11 }) 12 .catch((err) => { 13 console.log(err); 14 }) 15 .finally(() => { 16 console.log('done'); 17 });

試したこと

同様のことをGoogle検索であればできた(タイトルとURLを取得)のですが、duckduckGoとなるとできませんでした。
console.log(elm)でオブジェクトは返ってきたのですが、なぜか子要素にあるはずのh2タグは取得できません。
よろしくお願いいたします。

補足情報(FW/ツールのバージョンなど)

node v12.16.0
cheerio-httpcli 6.13.4

画像はidの#lihks以下をまとめて取得したいです。
イメージ説明

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

cheerioで取得したいです

それは無理です。

cheerio は 応答されたHTMLを解析できますが、それ以上の情報(JavaScriptで動的生成される文書木)は解析できません。

Google検索であればできた

Googleは検索結果をHTMLで応答していますが、DuckDuckGo の検索結果一覧は JavaScriptで動的生成しています
(この事象はブラウザでページのソースを表示して確認しました)。

投稿2020/04/26 11:34

AkitoshiManabe

総合スコア5434

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

moimoi_sushi

2020/04/27 01:30 編集

ありがとうございます。ソースを見ても動的サイトであることに気がつきませんでした。 duckduckGoの場合、" https://duckduckgo.com/html/?q=テスト "とhtmlの階層を付与すると静的サイトの結果として出力できたので、これで同じことをしたらうまくいきました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問