簡體   English   中英

如何從較大的字符串中提取子字符串?

[英]How do I extract a substring from a larger string?

我對網絡抓取非常陌生,我正在從 Billboard 的一個網站上抓取,該網站編制了 1958 年至 2021 年每年的前 10 首夏季歌曲。我的主要目標是最終得到一本以年份數字為鍵的字典,並且以 10 首歌曲作為關聯值的列表。

{"1958": ["NEL BLU DIPINTO DI BLU (VOLARÉ)", ...], "1959": ["LONELY BOY", ...]}

到目前為止,我擁有的是每年及其歌曲的列表,其中列表中的每個值都是多行,如下所示:

    1958Rank, Title, Artist
1, NEL BLU DIPINTO DI BLU (VOLARÉ), Domenico Modugno
2, POOR LITTLE FOOL, Ricky Nelson
3, PATRICIA, Perez Prado And His Orchestra
4, LITTLE STAR, The Elegants
5, MY TRUE LOVE, Jack Scott
6, JUST A DREAM, Jimmy Clanton And His Rockets
7, WHEN, Kalin Twins
8, BIRD DOG, The Everly Brothers
9, SPLISH SPLASH, Bobby Darin
10, REBEL-‘ROUSER, Duane Eddy His Twangy Guitar And The Rebels

有沒有辦法只提取歌曲標題並將它們添加到單獨的列表中? 我認為這可以通過某種方式檢查子字符串是否完全大寫來完成,因為歌曲標題全部大寫,或者子字符串是否在兩個逗號之間,因為標題在其位置值之后放置在逗號之間在歌曲名稱的末尾。

Billboard 網站的鏈接附在此處: https ://www.billboard.com/pro/summer-songs-1985-present-top-10-tunes-each-summer-listen/

對於新手來說非常有趣的問題。 我可以看到您已標記正則表達式,您對此有何經驗?

否則這對你有幫助嗎? https://stackoverflow.com/a/16835195/9519609

不需要regex - 要獲得預期的輸出,請僅選擇具有<strong><p>並遍歷其文本[s.split(', ')[1] for s in p.find_all(text=True)[2:]]

from bs4 import BeautifulSoup
import pandas as pd
import requests
   
doc = BeautifulSoup(requests.get(https://www.billboard.com/pro/summer-songs-1985-present-top-10-tunes-each-summer-listen/).text)
data = []
for p in doc.select('.pmc-paywall p:has(strong)'):
    data.append({
        p.strong.text:[s.split(', ')[1] for s in p.find_all(text=True)[2:]]
    })
print(data)

輸出:

[{'1958': ['NEL BLU DIPINTO DI BLU (VOLARÉ)', 'POOR LITTLE FOOL', 'PATRICIA', 'LITTLE STAR', 'MY TRUE LOVE', 'JUST A DREAM', 'WHEN', 'BIRD DOG', 'SPLISH SPLASH', 'REBEL-‘ROUSER']}, {'1959': ['LONELY BOY', 'THE BATTLE OF NEW ORLEANS', 'A BIG HUNK O’ LOVE', 'MY HEART IS AN OPEN BOOK', 'THE THREE BELLS', 'PERSONALITY', 'THERE GOES MY BABY', 'LAVENDER-BLUE', 'WATERLOO', 'TIGER']}, {'1960': ['I’M SORRY', 'IT’S NOW OR NEVER', 'EVERYBODY’S SOMEBODY’S FOOL', 'ALLEY-OOP', 'ITSY BITSY TEENIE WEENIE YELLOW POLKADOT BIKINI', 'ONLY THE LONELY (KNOW HOW I FEEL)', 'WALK — DON’T RUN', 'CATHY’S CLOWN', 'MULE SKINNER BLUES', 'BECAUSE THEY’RE YOUNG']},...]

一種獲取更多結構化數據的方法,包括可用於輕松構建數據框的排名和藝術家,可能是:

...
data = []
for p in doc.select('.pmc-paywall p:has(strong)'):
    for s in [dict(zip(p.find_all(text=True)[1].split(','),s.strip().split(', '))) for s in p.find_all(text=True)[2:]]:
        s.update({'year':p.strong.text})
        data.append(s)
pd.DataFrame(data)
標題 藝術家
1 NEL BLU DIPINTO DI BLU (VOLARÉ) 多梅尼科·莫杜尼奧 1958年
2 可憐的小傻瓜 瑞奇·納爾遜 1958年
3 帕特里夏 佩雷斯普拉多和他的管弦樂隊 1958年
4 小星星 優雅的 1958年
5 我的真愛 傑克斯科特 1958年

……

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM