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

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

新規登録して質問してみよう
ただいま回答率
85.50%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Q&A

解決済

1回答

289閲覧

htmlなのかjavascriptなのか見分ける方法。discordへの抽出結果の表示方法。

退会済みユーザー

退会済みユーザー

総合スコア0

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

0グッド

0クリップ

投稿2018/09/05 08:58

編集2018/09/05 09:00

discordbotを使用してhttps://worldoftanks.asia/ja/tournaments/のページの更新を一定時間間隔でチェックしその更新された情報とリンクを貼るというbotを作りたくて頑張っているものです。
ここでいろいろな質問をさせてもらいエラーはなくなりましたがいざbotを起動させてみると結果を抽出していないんじゃないかと思いましてまた質問をしました。
コマンドプロンプトで>ruby discordbot1.rb と入力してbotを起動させるとdiscordに

トーナメントページが更新されました 「<span class="landing-list_link" data-bind="text: translations.title, attr: {href: detailUrl}"></span>」 doc.at_css('.landing-list_info .landing-list_link').inner_text https://worldoftanks.asia/ja/tournaments/

と表示されました。
抽出して結果を表示しているのではなく、

トーナメントページが更新されました 「#{now_topic}」 doc.at_css('.landing-list_info .landing-list_link').inner_text https://worldoftanks.asia/ja/tournaments/

この部分を表示しているように思えました。
表示方法を抽出した情報「名前、tier、日にち、戦闘人数(?x?)」とリンクにするにはどうすればよいのでしょうか。
ほかの質問では「実はHTMLには書かれていなくて、JavaScriptで生成されているものだったりしませんか?」という疑問をいただいたのですが、もしjabascriptで書かれていた場合はどうすればよいのでしょうか。また、htmlとjavascriptを見分けるにはどうしたらよいのでしょうか。
#ソースコード

ruby

1# encoding: utf-8 2require 'discordrb' 3require 'open-uri' 4require 'nokogiri' 5require 'certified' 6 7bot = Discordrb::Bot.new token: 'NDY4NDIzMjE5MzE4MjI2OTQ0.Di48uA.OEDvrwbK5Yrm_M8o1URofoFgUxY', client_id: 468423219318226944 8 9bot.message(with_text: 'Ping!') do |event| 10 event.respond 'Pong!' 11end 12 13bot.run :async 14 15loop do 16 # 1時間ごとにアナウンスページを確認して、差分があれば内容を通知 17 18 # HTML解析 19 doc = Nokogiri::HTML.parse(open('https://worldoftanks.asia/ja/tournaments/')) 20 21 now_topic = doc.at_css('.landing-list_info .landing-list_link').inner_text 22 23 # 前回取得したトピックから更新があれば通知 24 if now_topic != File.read('C:\Users\やまと\Desktop\新しいフォルダー\プログラミング\current.txt') then 25 26 # brタグを"\n"に変換 27 doc.search('br').each do |br| 28 br.replace("\n") 29 end 30 31 msg = <<-EOS 32トーナメントページが更新されました 33#{now_topic}」 34 35doc.at_css('.landing-list_info .landing-list_link').inner_text 36 37https://worldoftanks.asia/ja/tournaments/ 38 39EOS 40 41bot.send_message(485685527865983007, msg) 42 43 # 今回取得したトピックを保存 44 File.open("C:/Users/やまと/Desktop/新しいフォルダー/プログラミング/current.txt", "w") do |f| 45 f.print("#{now_topic}") 46 end 47 48 sleep(3600) 49DEND 50 51DEND 52 53end 54 55end 56 57bot.run

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

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

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

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

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

guest

回答1

0

ベストアンサー

javascriptによって動的に追加された要素なのかを判断するには

  • ブラウザ上でページのソースの表示を行い、必要な情報が含まれているかを調べる
  • ブラウザ上でjavascriptをオフにしてブラウジングを行い必要な情報を見られるか調べる

前回の質問のところにコメントしましたが
https://worldoftanks.asia/wotpbe/tournaments/api/landing/?filter%5Blanguage%5D=ja
によって必要な情報はほぼ取得できるようです。

rb

1require 'open-uri' 2require 'json' 3 4# 適当UA偽装 5UserAgent = "Mozilla/5.0 (Linux; Android 8.1.0; Nexus 5X Build/OPM6.171019.030.E1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Mobile Safari/537.36" 6 7data = open("https://worldoftanks.asia/wotpbe/tournaments/api/landing/?filter%5Blanguage%5D=ja", 8 "rb", "User-Agent" => UserAgent) do |f| 9 JSON.parse f.read, symbolize_names: true 10 end 11 12raise "データ取得に失敗した可能性があります。\n\n#{data.pretty_inspect}" unless data[:status] == "ok" 13 14tournaments = data[:data][:results].map do |info| 15 { 16 tags: info[:tags].map{|it| it[:name]}, 17 title: info[:translations][:title], 18 start: Time.at(info[:start_at]), 19 tier_up_to: info[:extra_data][:allowed_vehicles_tier_up_to], 20 tier_from: info[:extra_data][:allowed_vehicles_tier_from], 21 players_in_team: info[:summary][:min_players_in_team], 22 teams_confirmed: info[:summary][:confirmed_teams], 23 teams_limit: info[:teams_limit], 24 url: "https://worldoftanks.asia/ja/tournaments/#{info[:id]}/", 25 id: info[:id] 26 } 27 end 28# あとは表示用に加工するだけなので、ご自分でお願いします

投稿2018/09/05 14:41

asm

総合スコア15147

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問