88742


PythonでWEBページをスクレイピングしたいです。  
[サイト](https://www.centrair.jp/flight/search/?da=A&id=D&fd=20220510)から航空会社(コードシェア)などのフライト情報を取得したいと考えています。

Selenium・BeautifulSoupで以下のコードを試してみたのですが、航空会社(コードシェア)だけが取得できません。

コードのどこがいけないのかスクレイピングに詳しい方教えていただけませんでしょうか。

HTML

[code]

    <div class="flight-codeshare"><ul><li><span class="flight-tail"><img src="/sys-assets/img/flight/airline/ANA-tail.png" alt="" class="fluid-image"></span><span class="flight-code">ANA3166</span></li></ul></div>
    
[/code]

一部のコード、"ANA3166" を取得したいです。

[code]

     # 航空会社(コードシェア)
        fa = li.select_one('span.flight-codeshare')
        data['航空会社(コードシェア)'] = fa.text if fa else ''
    
    
[/code]

全体コード

[code]

    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=20220510'
    
    driver = webdriver.Chrome(executable_path=ChromeDriverManager().install())
    #driver = webdriver.Chrome(executable_path="C:\selenium\chromedriver.exe")
    
    #フライ情報のサイトを開く
    driver.get(url)
    
    #5秒待機
    time.sleep(5)
    #BeautifulSoup指定
    html = driver.page_source.encode('utf-8')
    soup = BeautifulSoup(html, 'html.parser')
    
    tbl = []
    for li in soup.select('div.js-flight-search-result ul li'):
        data = {}
        # 定刻[変更]
        ft = li.select_one('span.flight-time-init')
        if ft is None: continue
        data['定刻[変更]'] = ft.text
        ct = li.select_one('span.flight-changetime')
        if ct: data['定刻[変更]'] += f'\n{ct.text}'
        # 出発地[経由]
        st = li.select_one('span.flight-destination')
        data['出発地[経由]'] = st.text if st else ''
        
        #便名
        fn = li.select_one('span.flight-airline')
        data['便名'] = fn.text if fn else ''
    
        # 航空会社(コードシェア)
        fa = li.select_one('span.flight-codeshare')
        data['航空会社(コードシェア)'] = fa.text if fa else ''
    
        # ターミナル
        term = li.select_one('span[class*=flight-terminal]')
        data['ターミナル'] = term.text if term else ''
    
        # 機種
        model = li.select_one('span.flight-status-text02')
        data['機種'] = model.text.split(':')[-1].strip() if model else ''
        # 現在の状況
        status = li.select_one('span.flight-status-icon')
        data['現在の状況'] = status.text if status else ''
        #
        tbl.append(data)
    
    df = pd.DataFrame(tbl)
    print(df)
    
    # #Excel形式でハルエネ出力-------------------
    # #df.to_excel(file,index=False,encoding='utf-8')
    df.to_csv(file,index=False,encoding="utf_8_sig")
    
[/code]

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


CC BY-SA 4.0
2022-05-10T03:09:31.730
88741
2022-05-10T06:17:25.237
2022-05-10T05:05:58.117
3060
18859
question
python python3 web-scraping
特定の箇所WEBスクレイピングができない


該当部分のhtmlがこんな感じなので：

[code]

    <li class="hour10">
      <a href="/flight/detail.html?fno=A-D-20220510-ibx66">
        <div class="flight-time flight-time-change font-roboto">
          <span class="flight-time-init">
            <span>10:10</span>
          </span>
          <span class="flight-changetime">09:59</span>
        </div>
        <div class="flight-main">
          <span class="flight-tail"><img src="/sys-assets/img/flight/airline/IBX-tail.png" alt="" class="fluid-image"></span>
          <span class="flight-destination">大分</span>
          <span class="flight-airline">
            <span class="flight-code">IBX 66</span>
            <span class="flight-airline-name">IBEXエアラインズ</span>
          </span>
        </div>
        <div class="flight-codeshare">
          <ul>
            <li>
              <span class="flight-tail"><img src="/sys-assets/img/flight/airline/ANA-tail.png" alt="" class="fluid-image"></span>
              <span class="flight-code">ANA3166</span>
            </li>
          </ul>
        </div>
        <div class="flight-boarding"><span class="flight-terminal font-roboto">T1</span></div>
        <div class="flight-status">
          <span class="flight-status-icon">到着済み</span>
          <div><span class="flight-status-text02">機種 : CRJ7</span></div>
        </div>
      </a>
    </li>
    
[/code]

こんな風にすれば出来るのでは？

[code]

        # 航空会社(コードシェア)
        fa = li.select_one('div.flight-codeshare')
        fa = fa.select_one('span.flight-code') if fa else ''
        data['航空会社(コードシェア)'] = fa.text if fa else ''
    
[/code]

* * *

**コメント対応**

コードシェアが複数ある場合も抽出できるようにするには以下になるでしょう。  
複数ある場合の区切り記号を変えたい場合は、`','.join()`の`,`を変えれば良いでしょう。

[code]

        # 航空会社(コードシェア)
        fa = li.select_one('div.flight-codeshare')
        cdshare = ','.join([s.text for s in fa.find_all(class_='flight-code') if s])
        data['航空会社(コードシェア)'] = cdshare if cdshare else ''
    
[/code]


CC BY-SA 4.0
2022-05-10T04:36:27.920
88742
2022-05-10T06:17:25.237
2022-05-10T06:17:25.237
26370
26370
88741
answer