スパルタネットワーク開発総合クラス第3週-課題

11078 ワード

簡体字音楽


ランキング/曲名/歌手をスクリプト化して出力するコードを書きます.
  • Genie音楽サイトにアクセスし、要素がどのコレクターにあるかを確認します.
  • # rank = soup.select_one('#body-content > div.newest-list > div > table > tbody > tr:nth-child(1) > td.number')
    # artist = soup.select_one('#body-content > div.newest-list > div > table > tbody > tr:nth-child(1) > td.info > a.artist.ellipsis')
    # title = soup.select_one('#body-content > div.newest-list > div > table > tbody > tr:nth-child(1) > td.info > a.title.ellipsis')
  • は、コレクタのパスではなく上流の位置からすべて選択されたコレクタを定義し、繰り返し文を実行し、サブコレクタの結果を繰り返し出力する.
  • songs = soup.select('#body-content > div.newest-list > div > table > tbody > tr') 
    #tr 까지는 내가 가져오려는 정보의 경로가 
    #일치하므로 이렇게 선언을 해놓고 사용하면 편리하다.
    import requests
    from bs4 import BeautifulSoup
    
    from pymongo import MongoClient
    import certifi
    ca = certifi.where()
    
    client = MongoClient('mongodb+srv://test:[email protected]/Cluster0?retryWrites=true&w=majority', tlsCAFile=ca )
    db = client.dbsparta
    
    #유저가 부른 것처럼 하기 위한 header 속성
    headers = {'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36'}
    data = requests.get('https://www.genie.co.kr/chart/top200?ditc=M&rtm=N&ymd=20210701',headers=headers)
    soup = BeautifulSoup(data.text, 'html.parser')
    
    # rank = soup.select_one('#body-content > div.newest-list > div > table > tbody > tr:nth-child(1) > td.number')
    # artist = soup.select_one('#body-content > div.newest-list > div > table > tbody > tr:nth-child(1) > td.info > a.artist.ellipsis')
    # title = soup.select_one('#body-content > div.newest-list > div > table > tbody > tr:nth-child(1) > td.info > a.title.ellipsis')
    
    songs = soup.select('#body-content > div.newest-list > div > table > tbody > tr')
    
    for song in songs:
        ranks = song.select_one('td.number')
        artists = song.select_one('td.info > a.artist.ellipsis')
        titles = song.select_one('td.info > a.title.ellipsis')
    
        if ranks is not None:
            rank = ranks.text[0:2].strip()
            title = titles.text.strip()
            artist = artists.text
    
            print(rank,title,artist)
    
    title = song.select_one('td.info > a.title.ellipsis').text.strip()
    
    そうすると、結果はよさそうですが、問題があります.

    真ん中にこんな大きな空白ができたので、Genie音楽サイトに入って調べてみましたが、

    この項目のタイトルには19禁のラベルが貼られており、出力中に空白ができた.
  • 19禁が発生した場合に空白を解消するために、コードを修正する過程でstrip()をよく勉強しました.
  • PythonのStringには、次の関数があります.
    strip([Cars]):Stringの左側と右側からパラメータとして渡される文字を削除します.
    lstrip([Cars]):Stringの左側からパラメータとして渡される文字を削除します.
    rstrip([Cars]):Stringの右側からパラメータとして渡される文字を削除します.
    これらの情報を参考にして練習を行い,上記の情報の結果であれば,出力された値は削除された値に違いないと考えた.
    text = ' Water boils at 100 degrees'
    
    tests = text.strip('Water')
    
    print(tests)

    拭き取れない.
    ただしWater左側の空白を除いて運転

    水がふき取られた.
    ※stilip([Chars])この文字列の外部にスペースがないと正常に動作しません.
    さて再び課題に戻りますが、出力するtitle値にstrip()が適用されているので、外部空白はありません.そこで、「19禁lstrip("19禁")を外した後、さらに19禁という言葉を加えてstrip()で空白を取り除きます」.
    for song in songs:
        ranks = song.select_one('td.number')
        artists = song.select_one('td.info > a.artist.ellipsis')
        titles = song.select_one('td.info > a.title.ellipsis')
    
        if ranks is not None:
            rank = ranks.text[0:2].strip()
            title = titles.text.strip()
            if '19금' in title:
                title = "19금" + title.lstrip('19금').strip() 
                # 19금 단어를 제거하고, 19금 단어를 추가한뒤 공백제거
            artist = artists.text
    
            print(rank,title,artist)
    
    

    正常に動作する.
    タスクの実行中に変数が発生したが,解決策を見つける意味がある.ユーザが見るページを実現し,サーバとdb,Webスクリプトによるデータ取得も習得した.両方使えるようになるまで勉強して、Webサービスを簡単に構築できる実力になるべきだと思います.