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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

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

Python

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

Q&A

解決済

2回答

489閲覧

beautifulsoupを使ってスクレイピング

fideo

総合スコア55

Python 3.x

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

Python

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

0グッド

0クリップ

投稿2023/02/09 07:39

前提
フライト一覧のテーブルを取得したいです。
下記のコードで試してみましたが綺麗に取得できないです。
実現結果ののようにどのように取得すれば良いでしょうか。
お手数ですが、ご確認をお願い致します。

実現したい結果
下記のようにCSVで出力して、1行ずつにで書き込みたいです。

定刻,変更時刻,目的地/経由地,航空会社,便名,搭乗口,備考 10:00,10:37,バンコク,タイ国際航空,TG671,67,出発済み 10:00,10:37,バンコク,ANA,NH5985,67,共同運航便 11:20,11:30,ソウル,済州航空,7C1961,65,出発済み      ・      ・      ・

現在の出力結果

company " タイ国際航空 TG671 バンコク  10:00   10:37  搭乗口: 67   備考:出発済み " " 済州航空 7C1961 ソウル  11:20   11:30  搭乗口: 65   備考:出発済み "

コード

import requests from bs4 import BeautifulSoup import pandas as pd #保存ファイル file_name=r"C:\Users\test\flights.csv" # ウェブページの HTML を取得します url = "https://www.new-chitose-airport.jp/ja/airport/fis/result/?ap=int&type=dep&po=&co=&tf=4&tt=26" response = requests.get(url) soup = BeautifulSoup(response.content, "html.parser") #print(soup) # 必要なデータを抽出してリストに保存します flights = [] table = soup.find("ul", attrs={"class": "airline_list"}) for row in table.find_all("ul"): cells = row.find_all("li") #print(cells) flight = {} flight["company"] = cells[0].text # flight["destinat"] = cells[1].text # flight["appoint"] = cells[2].text # flight["time"] = cells[3].text # flight["enter"] = cells[4].text # flight["remark"] = cells[5].text flights.append(flight) print(flight) # リストを Pandas DataFrame に変換 df = pd.DataFrame(flights) # DataFrame を csv df.to_csv(file_name, index=False,encoding="utf_8_sig")

もし他の方法で簡単に取得する方法あれば、教えていただけると嬉しいです。
お手数ですが、よろしくお願い致します。

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

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

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

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

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

guest

回答2

0

ベストアンサー

python

1import requests 2from bs4 import BeautifulSoup 3import pandas as pd 4import numpy as np 5 6file_name=r"C:\Users\test\flights.csv" 7url = "https://www.new-chitose-airport.jp/ja/airport/fis/result/?ap=int&type=dep&po=&co=&tf=4&tt=26" 8response = requests.get(url) 9soup = BeautifulSoup(response.content, "html.parser") 10 11flights = [] 12for result in soup.select(".search_result > li"): 13 f = result.select(".appoint, .time, .destinat, .company, .code, .enter, .remark") 14 flights.append([i.text.strip() for i in f]) 15 16df = pd.DataFrame(flights) 17df.columns = ['航空会社', '便名', '目的地/経由地', '定刻', '変更時刻', '搭乗口', '備考'] 18df['搭乗口'] = df['搭乗口'].replace(r'搭乗口:\s*', '', regex=True) 19df['備考'] = df['備考'].replace(r'備考:\s*', '', regex=True) 20cols = [c for c in df.columns if c != '変更時刻'] 21df[cols] = df[cols].replace('', np.NaN).ffill() 22df = df[['定刻', '変更時刻', '目的地/経由地', '航空会社', '便名', '搭乗口', '備考']] 23 24# DataFrame を csv 25df.to_csv(file_name, index=False,encoding="utf_8_sig")

flights.csv

csv

1定刻,変更時刻,目的地/経由地,航空会社,便名,搭乗口,備考 210:00,12:10,バンコク,タイ国際航空,TG671,67,出発済み 310:00,,バンコク,ANA,NH5985,67,共同運航便 411:20,11:16,ソウル,済州航空,7C1961,66,出発済み 511:30,12:47,台北,タイガーエア台湾,IT235,68,出発済み 611:55,12:05,釜山,エアプサン,BX181,65,出発済み 711:55,,釜山,アシアナ航空,OZ9729,65,共同運航便 812:10,,台北,エバー航空,BR165,65,欠航 912:10,,台北,ANA,NH5837,65,共同運航便 1012:10,,台北,ニュージーランド航空,NZ4927,65,共同運航便 1112:10,,台北,タイ国際航空,TG6367,65,共同運航便 1212:25,12:29,ソウル,ジンエアー,LJ232,64,出発済み 1312:25,,ソウル,大韓航空,KE5062,64,共同運航便 1413:00,,ソウル,アシアナ航空,OZ173,71,搭乗終了 1513:00,,ソウル,エチオピア航空,ET1293,71,共同運航便 1613:00,,ソウル,ANA,NH6997,71,共同運航便 1713:30,,釜山,ジンエアー,LJ238,65,搭乗手続終了 1813:30,,釜山,大韓航空,KE5064,65,共同運航便 1914:00,,ソウル,大韓航空,KE766,70,搭乗手続終了 2014:00,,ソウル,日本航空,JL5209,70,共同運航便 2114:00,,ソウル,KLMオランダ航空,KL4250,70,共同運航便 2214:00,,ソウル,デルタ航空,DL7904,70,共同運航便 2314:00,,ソウル,エティハド航空,EY8490,70,共同運航便 2414:20,,南京,上海吉祥航空,HO1618,70,欠航 2514:20,,台北,チャイナエアライン,CI131,69,出国手続中 2614:20,,台北,日本航空,JL5109,69,共同運航便 2714:50,,ソウル,ジンエアー,LJ234,66,出国手続中 2814:50,,ソウル,ティーウェイ航空,TW252,67,出国手続中 2915:00,,上海,上海吉祥航空,HO1382,67,欠航 3015:00,,上海,中国東方航空,MU1028,67,共同運航便 3115:00,,台北,スターラックス航空,JX851,68,出国手続中 3215:20,,台北,エバー航空,BR115,71,出国手続中 3315:20,,台北,ANA,NH5815,71,共同運航便 3415:20,,台北,ニュージーランド航空,NZ4911,71,共同運航便 3515:20,,台北,タイ国際航空,TG6337,71,共同運航便 3615:30,,香港,香港航空,HX691,70,出国手続中 3715:55,,ソウル,済州航空,7C1901,64,搭乗手続き中 3816:00,,上海,上海吉祥航空,HO1384,64,欠航 3916:00,,ソウル,ティーウェイ航空,TW254,65,欠航 4016:05,,香港,キャセイ・パシフィック航空,CX581,69,搭乗手続き中 4116:05,,香港,日本航空,JL7061,69,共同運航便 4216:50,,ソウル,大韓航空,KE770,69,欠航 4317:10,,香港,キャセイ・パシフィック航空,CX583,69,欠航 4417:10,,香港,日本航空,JL7065,69,共同運航便 4519:00,,ユジノサハリンスク,オーロラ航空,HZ4537,69,欠航

投稿2023/02/09 09:00

編集2023/02/12 04:34
melian

総合スコア19703

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

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

fideo

2023/02/12 04:20

回答ありがとうございます。 上記の方法で行ってみましたが、'変更時刻'がないフライトなぜか 下記のように前のフライト情報の変更時刻が反映されます。 ない場合空白にすることは可能でしょうか。 お手数ですが、ご確認をお願い致します。 誤 24行:14:20 12:29 南京 上海吉祥航空 HO1618 正 24行:14:20 南京 上海吉祥航空 HO1618 誤 31行:15:00 12:29 台北 スターラックス航空 JX851 68 搭乗手続き中 正 31行:15:00 台北 スターラックス航空 JX851 68 搭乗手続き中
melian

2023/02/12 04:35

回答を更新しました。
fideo

2023/02/12 05:58 編集

ありがとうございます。上記の方法で問題なくできました。 ちなみにですが、.search_result > liのタグはどのように取得しますか。 検証からcopy selectorで下記のセレクタしか取得できないです。 search_result_list > ul
melian

2023/02/12 06:15 編集

利用しているブラウザが違うかもしれませんが、FireFox では、ul の内部の li 部分にフォーカスを当てて、copy CSS path で取得できます。ただ、本来は .search_result > ul > li なのですが、途中の ul は省略可能なので回答では .search_result > li としています。
fideo

2023/02/12 06:58

丁寧にありがとうございます。 度々、すいません 搭乗口も変更時刻の列と同じようにない場合には空白にしたいですが、 andをif分岐に入れましたが搭乗口の列には反映されませんした。 複数の列の指定の場合はどのように指定すれば良いでしょうか。 cols = [c for c in df.columns if c != '変更時刻'and'搭乗口']
melian

2023/02/12 07:02

その場合は以下の様に変更して下さい。 cols = [c for c in df.columns if c not in ('変更時刻', '搭乗口')]
fideo

2023/02/12 07:27

ありがとうございます。できました。
guest

0

cells[0].textで取得できているのがstr型であることに気が付ければ、あとは文字列の操作(ブランクや改行コードなどのいらない情報を削除)し、文字列をリストに分割していけば必要な情報のみが扱いやすい形になります。

Python

1import requests 2from bs4 import BeautifulSoup 3import pandas as pd 4 5file_name=r"C:\Users\test\flights.csv" 6 7# ウェブページの HTML を取得します 8url = "https://www.new-chitose-airport.jp/ja/airport/fis/result/?ap=int&type=dep&po=&co=&tf=4&tt=26" 9response = requests.get(url) 10soup = BeautifulSoup(response.content, "html.parser") 11#print(soup) 12 13# 必要なデータを抽出してリストに保存します 14flights = [] 15table = soup.find("ul", attrs={"class": "airline_list"}) 16for row in table.find_all("ul"): 17 cells = row.find_all("li") 18 flight = {} 19 blank_delete_str = cells[0].text.replace(" ", "") #ブランク削除 20 edit_str = blank_delete_str.replace("\n",",") #改行コード削除 21 edit_str2 = edit_str.replace("\xa0","") #不要な文字列削除 22 split_list = edit_str2.split(',') #1つのstrを「,」で分割したリストの作成 23 flight["定刻"] = split_list[5] 24 flight["変更時刻"] = split_list[6] 25 flight["目的地/経由地"] = split_list[4] 26 flight["航空会社"] = split_list[2] 27 flight["便名"] = split_list[3] 28 flight["搭乗口"] = split_list[9] 29 flight["備考"] = split_list[12][3:] 30 print(split_list) 31 flights.append(flight) 32print(flights) 33 34# リストを Pandas DataFrame に変換 35df = pd.DataFrame(flights) 36 37# DataFrame を csv 38df.to_csv(file_name, index=False,encoding="utf_8_sig")

投稿2023/02/09 08:26

TKMoon

総合スコア79

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

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

fideo

2023/02/12 04:23 編集

回答ありがとうございます。 こちらの方法でも試してみましたが、なぜか上記のコードだと全てのフライト情報は取得できないです。 コードシシェアだけ取得できていないようです。 取得することは可能でしょうか。 お手数ですが、ご確認をお願い致します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問