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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Beautiful Soup

Beautiful Soupは、Pythonのライブラリの一つ。スクレイピングに特化しています。HTMLデータの構文の解析を行うために、HTMLタグ/CSSのセレクタで抽出する部分を指定することが可能です。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

985閲覧

BeautifulSoupでDataFrameを使ってスクレイピン方法

fideo

総合スコア55

Beautiful Soup

Beautiful Soupは、Pythonのライブラリの一つ。スクレイピングに特化しています。HTMLデータの構文の解析を行うために、HTMLタグ/CSSのセレクタで抽出する部分を指定することが可能です。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2022/05/03 08:01

PythonのBeautifulSoup・Pandasを使って、下記のWEBをスクレイピングしたいです。
BeautifulSoupのスクレイピング勉強中です。

URL
centrairFligth

下記のようにカラム1個ずつで分けてデータを出力したいです。

実現したい結果

定刻[変更]出発地[経由]航空会社(コードシェア)ターミナル機種現在の状況
08:55 08:47福岡ANA 432ANAT1B738到着済み
08:55 08:47東京(羽田)DLH4967 SAS9481 UAL7956T1B738到着済み

現在の結果1カラムに全て入力されます。
1個ずつのカラムに分けることは可能でしょうか。

良い方法が見つからず、DataFrameで行っています。

コメントアウトしている部分ですが、
以前はdf=dfs[0] Tableで簡単に取得出来ておりましたが、
Tableからclassへ変更されたのでスクレイピングの取得が難しくなりました。

もしもう少し簡単な方法ありましたら、教えていただけますか。

お手数ですが、よろしくお願い致します。

現在の結果

定刻[変更]出発地[経由]航空会社(コードシェア)ターミナル機種現在の状況
08:55 08:47福岡ANA 432ANAT1B738到着済み08:55 08:47福岡ANA 432ANAT1B738到着済み...

全体のコード

import pandas as pd import time from datetime import datetime as dt, date, timedelta from dateutil.relativedelta import relativedelta from selenium import webdriver from bs4 import BeautifulSoup from webdriver_manager.chrome import ChromeDriverManager file_time= dt.now().strftime("%Y%m%d") today= dt.now().strftime("%Y/%m/%d") #保存ファイル指定 file="test"+file_time+".csv" #url指定 url = 'https://www.centrair.jp/flight/search/?da=A&id=D&fd=20220503' driver = webdriver.Chrome(executable_path=ChromeDriverManager().install()) #driver = webdriver.Chrome(executable_path="C:\selenium\chromedriver.exe") #Chubuフライ情報のサイトを開く driver.get(url) #2秒待機 time.sleep(2) #BeautifulSoup指定 html = driver.page_source.encode('utf-8') soup = BeautifulSoup(html, 'html.parser') #print(soup) data= soup.find('div', class_='js-flight-search-result').text print(data) df = pd.DataFrame({'定刻[変更]': [data],'出発地[経由]': [data],'航空会社(コードシェア)': [data],'ターミナル': [data],'機種': [data],'現在の状況': [data]}) print(df) # dfs = pd.read_html(html) # df=dfs[0] # #Table print # #print(df) # #Excel形式でハルエネ出力------------------- # #df.to_excel(file,index=False,encoding='utf-8') df.to_csv(file,index=False,encoding="utf_8_sig")

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

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

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

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

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

guest

回答1

0

ベストアンサー

python

1#Chubuフライ情報のサイトを開く 2driver.get(url) 3 4#2秒待機 5time.sleep(5) 6#BeautifulSoup指定 7html = driver.page_source.encode('utf-8') 8soup = BeautifulSoup(html, 'html.parser') 9 10tbl = [] 11for li in soup.select('div.js-flight-search-result ul li'): 12 data = {} 13 # 定刻[変更] 14 ft = li.select_one('span.flight-time-init') 15 if ft is None: continue 16 data['定刻[変更]'] = ft.text 17 ct = li.select_one('span.flight-changetime') 18 if ct: data['定刻[変更]'] += f'\n{ct.text}' 19 # 出発地[経由] 20 st = li.select_one('span.flight-destination') 21 data['出発地[経由]'] = st.text if st else '' 22 # 航空会社(コードシェア) 23 fa = li.select_one('span.flight-airline') 24 data['航空会社(コードシェア)'] = fa.text if fa else '' 25 # ターミナル 26 term = li.select_one('span[class*=flight-terminal]') 27 data['ターミナル'] = term.text if term else '' 28 # 機種 29 model = li.select_one('span.flight-status-text02') 30 data['機種'] = model.text.split(':')[-1].strip() if model else '' 31 # 現在の状況 32 status = li.select_one('span.flight-status-icon') 33 data['現在の状況'] = status.text if status else '' 34 # 35 tbl.append(data) 36 37df = pd.DataFrame(tbl) 38print(df) 39 40# 41 定刻[変更] 出発地[経由] 航空会社(コードシェア) ターミナル 機種 現在の状況 420 08:55\n08:47 福岡 ANA 432ANA T1 B738 到着済み 431 09:30\n09:27 仙台 ANA 362ANA T1 DH8D 到着済み 442 10:10\n10:16 福岡 ANA 434ANA T1 B738 到着済み 453 10:10\n10:05 大分 IBX 66IBEXエアラインズ T1 CRJ7 到着済み 464 10:25 札幌(新千歳) ADO 130エア・ドゥ T1 B737 到着済み 47.. ... ... ... ... ... ... 4874 22:10\n22:09 沖縄(那覇) SKY 558スカイマーク T1 B738 到着済み 4975 22:10\n21:59 沖縄(那覇) JTA 48日本トランスオーシャン航空 T1 B738 到着済み 5076 22:30\n22:31 札幌(新千歳) SKY 768スカイマーク T1 B738 到着済み 5177 22:35\n22:28 札幌(新千歳) APJ 466Peach T1 A320 到着済み 5278 22:45\n22:31 鹿児島 SKY 638スカイマーク T1 B738 到着済み 53 54[79 rows x 6 columns]

投稿2022/05/04 00:54

編集2022/05/04 00:59
melian

総合スコア19805

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

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

fideo

2022/05/09 00:55

回答ありがとうございます。上記の方法で試してみます。
fideo

2022/05/09 02:56

確認致しました。 航空会社(コードシェア)の取得が間違っております。 上記のコードだと便名を取得しております。 すいません、コードシェアは取得可能でしょうか。 例えば本日のであれば、 福岡ANA 432 THA6043⇨コードシェアになります。 下記の方法で試してみましたが、コードシェア取得できませんでした。 # 航空会社(コードシェア) fa = li.select_one('span.flight-codeshare') data['航空会社(コードシェア)'] = fa.text if fa else '' # 航空会社(コードシェア) fa = li.select_one('span.flight-code') data['航空会社(コードシェア)'] = fa.text if fa else '' もし分かりましたら、教えていただけると幸いです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問