Cliquez ici pour récupérer les données (https://www.data.jma.go.jp/obd/stats/etrn/view/10min_s1.php?prec_no=44&block_no=47662&year=2019&month=01&day=01&view=p1)

# -*- coding: utf-8 -*-
import pandas as pd
import urllib.request
from bs4 import BeautifulSoup
url = 'https://www.data.jma.go.jp/obd/stats/etrn/view/10min_s1.php?prec_no=44&block_no=47662&year=2019&month=01&day=01&view=p1'
html = urllib.request.urlopen(url)
soup = BeautifulSoup(html, 'html.parser')
element = soup.find_all('tr', attrs={'class':'mtx', 'style':'text-align:right;'})
out = []
for ele in element:
  data_list = []
  for e in ele:
    data_list.append(e.text)
  out.append(data_list)
df = pd.DataFrame(data=out, columns=['Heure et minute','Pression locale','Pression au niveau de la mer','Précipitation','Température','Humidité relative','Vitesse moyenne du vent','Direction moyenne du vent','Vitesse du vent instantanée maximale','Direction instantanée maximale du vent','Heure du soleil'])
df.to_csv('tokyo_2019-01-01.csv', index=None,encoding='SJIS')
#① Génération d'objets pour analyser le HTML spécifié
soup = BeautifulSoup(html, 'html.parser')
#② Obtenez toutes les balises tr en spécifiant les conditions
element = soup.find_all('tr', attrs={'class':'mtx', 'style':'text-align:right;'})
Après cela, extrayez-en le texte et ajoutez-le à la liste un par un
** ↓ Résultat de sortie ↓ **

require 'csv'
require 'mechanize'
agent = Mechanize.new
url = 'https://www.data.jma.go.jp/obd/stats/etrn/view/10min_s1.php?prec_no=44&block_no=47662&year=2019&month=01&day=01&view=p1'
page = agent.get(url)
html = page.search('tr')
out = []
html.each do |element|
    if element.get_attribute('style') == 'text-align:right;' then
        data_list=[]
        ele = element.search('td')
        ele.each do |e|
            data_list << e.inner_text
        end
        out << data_list
    end
end
header = ['Heure et minute','Pression locale','Pression au niveau de la mer','Précipitation','Température','Humidité relative','Vitesse moyenne du vent','Direction moyenne du vent','Vitesse du vent instantanée maximale','Direction instantanée maximale du vent','Heure du soleil']
CSV.open('tokyo_2019-01-01.csv','w') do |csv|
    csv << header
    out.each do |val|
        csv << val
    end        
end
#① Créez une instance de la classe Mechanize et récupérez le HTML de l'url spécifiée
agent = Mechanize.new
page = agent.get(url)
#② Après avoir recherché la balise tr avec la méthode de recherche, la balise de style est du texte-align:intérieur quand il a raison_Obtenir du texte avec la méthode text
html = page.search('tr')
out = []
html.each do |element|
    if element.get_attribute('style') == 'text-align:right;' then
        data_list=[]
        ele = element.search('td')
        ele.each do |e|
            data_list << e.inner_text
#~ abrégé ~
** ↓ Résultat de sortie ↓ **

Étonnamment, il n'y avait pas beaucoup de différence dans la quantité de code. Est-il possible de rechercher des balises en spécifiant des attributs dans Ruby? .. ..
c'est tout! !! !!
Recommended Posts