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

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

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

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

Google スプレッドシート

Google スプレッドシートは、フリーで利用できる表計算ソフト。Webアプリのためインターネットに接続することで利用できます。チャートやグラフの作成のほか、シートを他のユーザーと共有したり、同時に作業を進めることも可能です。

Q&A

解決済

1回答

1156閲覧

Newsのスクレイピング結果をGoogleスプレッドシートに表示したい

szngk

総合スコア14

スクレイピング

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

Google スプレッドシート

Google スプレッドシートは、フリーで利用できる表計算ソフト。Webアプリのためインターネットに接続することで利用できます。チャートやグラフの作成のほか、シートを他のユーザーと共有したり、同時に作業を進めることも可能です。

0グッド

0クリップ

投稿2021/10/24 06:06

YahooNewsのNewsタイトル(8件)と、そのURLのクレイピングをしています。(Cheerio使用)

Console.logでは、8件分のNewsとURLが表示されますが、Googleスプレッドシートには、8番目のNewsタイトルとそのURLだけが、8行分表示されます。どうしたらいいでしょうか?

試したこと
setValue(title)、setValue(link)→ setValue(title[i])、setValue(link[i])に変更。
→ 8番目のNewsタイトルとURLの、各8番目の文字だけ、8行分表示されます。

jQuery

1function myFunction() { 2 const html = UrlFetchApp.fetch('https://www.yahoo.co.jp').getContentText('UTF-8'); 3 const $ = Cheerio.load(html); 4 const _li = $('main section ul').eq(0).find('li'); 5 6// ニュースを表示 7_li.map(function(i) { 8 const title = _li.eq(i).text(); 9 console.log(title); 10 const link = _li.eq(i).find('a').attr()['href']; 11 console.log(link); 12 13 const spreadsheet = SpreadsheetApp.openById(" "); 14 const sheet = spreadsheet.getSheetByName('newsLink'); 15 sheet.getRange(1,1,i + 1,1).setValue(title); 16 sheet.getRange(1,2,i + 1,1).setValue(link); 17}); 18}

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

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

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

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

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

175

2021/10/24 09:01

titleとlinkの中身に問題がないなら原因は一つですよね getRangeの使い方をもう一度調べてみては?
szngk

2021/10/25 03:22 編集

投稿頂き有難うございます。 色々試したのですが(getRange(1,1,i+1,1) → getRange(1,1,_li.length,_li[0].length)、map→for、setValue→setValues等)、色々エラーが出て解決できなかったため、classを使用する事にしました。 また後ほどよく調べてみようと思います。
175

2021/10/25 00:45

動くようになったようですが一応補足 最初のコードはgetRangeで範囲選択をしています 最初の行からそのループで本来書き込むはずだった行まで選択しsetValueしているので、ループの最後の周ですべての行が同じ値に書き換わります。
szngk

2021/10/25 03:26

有難うございます。 色々調べてみます。
szngk

2021/11/07 07:30

下記で解決しました。 sheet.getRange(i + 1,1).setValue(titles); sheet.getRange(i + 1,2).setValue(links); (でもgetRangeの設定の少しの違いで、なぜ色々表示が違うのかよくわかっておらず、後日別の質問をする予定です---。) アドバイスを頂き有難うございました。
guest

回答1

0

自己解決

質問したCodeでは、色々試したのですが(getRange(1,1,i+1,1) → getRange(1,1,_li.length,_li[0].length)、map→for、setValue→setValues等)、色々エラーが出て解決できなかったため、classを使用する事にしました。
Newsのタイトル・URLを下記で取得し、Googleスプレッドシートに表記できました。

let getData = []
$('.sc-ksYbfQ').each((i,element) => {
getData.push($(element).text())
})
console.log(getData);

$(".sc-hmzhuo").each(function(i){
var link=$(this).attr("href");
console.log(link);
})


追記
質問Codeについては下記で解決しました。
sheet.getRange(i + 1,1).setValue(titles);
sheet.getRange(i + 1,2).setValue(links);

投稿2021/10/25 00:06

編集2021/11/07 07:40
szngk

総合スコア14

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問