すべての「シンボル」アイテムをリストにスクレイピングするにはどうすればよいですか?

以下の URL からすべての「シンボル」要素をスクレイピングする方法を見つけようとしています。すべてのシンボル項目をリストに入れたい.

https:// etfdb.com/screener/#page=1&tab=returns&sort_by=one_week_return&sort_direction=desc&asset_class=equity&one_week_return_start=2&one_month_return_start=5&ytd_start=20&fifty_two_week_start=30

これを取得したい: lst = ['NRGU', 'CHIE' .... 'PSCE', 'FXN']

この概念をテストしましたが、必要以上のものが得られました…「シンボル」項目だけに絞り込む方法がわかりません.

# Web ページのすべての TR & TD 要素を印刷
from bs4 import BeautifulSoup
インポートリクエスト
パンダを pd としてインポート
csvをインポート

url = "https://etfdb.com/screener/#page=1&tab=returns&sort_by=one_week_return&sort_direction=desc&asset_class=equity&one_week_return_start=2&one_month_return_start=5&ytd_start=20&fifty_two_week_start=30"
ページ = requests.get(url)
pagetext = page.text
print(ページテキスト)

スープ = BeautifulSoup(pagetext, 'html.parser')

soup.find_all('tr') の行の場合:
row.find_all('td') の列の場合:
info1 = 行.テキスト
印刷(情報1)
info2 = col.text
印刷 (info2)

これを行う方法について何か考えはありますか?

インポートリクエスト

デフメイン(URL):
データ = {
"asset_class": "株式",
"fifty_two_week_start": "30",
"one_month_return_start": "5",
"one_week_return_start": "2",
"それだけ": [
"メタ"、
"データ"、
"カウント"
]、
"ページ1、
"sort_by": "one_week_return",
"sort_direction": "desc",
"タブ": "リターン",
"ytd_start": "20"
}
r = requests.post(url, json=データ)
Symbols = [i['symbol']['text'] for i in r.json()['data']]
印刷(記号)

if __name__ == "__main__":
メイン('https://etfdb.com/api/screener/')

実際には、データは API as POST method as json format as API を使用して外部ソースから動的にロードされます。そのため、bs4 はデータを解析/模倣できず、HTML DOM からそのようなデータを引き出すことができません。したがって、データを取得するには 2 つのオプションがあります。 1. Selenium などの自動化ツールを使用します。 2. API からデータを抽出します。これは最も簡単で堅牢な方法です。

インポートリクエスト
パンダを pd としてインポート
ペイロード = {
"asset_class": "株式",
"fifty_two_week_start": "30",
"one_month_return_start": "5",
"one_week_return_start": "2",
"それだけ": [
"メタ"、
"データ"、
"カウント"
]、
"ページ1、
"sort_by": "one_week_return",
"sort_direction": "desc",
"タブ": "リターン",
"ytd_start": "20"
}

api_url= 'https://etfdb.com/api/screener/'
ヘッダー= {
"コンテンツタイプ": "アプリケーション/json",
"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (Gecko のような KHTML) Chrome/104.0.0.0 Safari/537.36",
}

lst=[]
範囲 (1,3) のペイロード ['ページ'] の場合:
req=requests.post(api_url,headers=headers,json=payload).json()

req['data'] のアイテムの場合:
lst.append({
"シンボル":アイテム['シンボル']['テキスト']})

印刷(lst)
# df = pd.DataFrame(lst)
# プリント(df)

出力:

[{'symbol': 'NRGU'}, {'symbol': 'GUSH'}, {'symbol': 'ERX'}, {'symbol': 'DIG'}, {'symbol ': 'EPV'}, {'symbol': 'CHIE'}, {'symbol': 'PXI'}, {'symbol': 'PXE'}, {'symbol': 'OIH'}, {'symbol'} ': 'IEO'}, {'シンボル': 'IEZ'}, {'シンボル': 'FCG'},
{'symbol': 'FTXN'}, {'symbol': 'XOP'}, {'symbol': 'PSCE'}, {'symbol': 'XES'​​}, {'symbol': 'XLE'}, {'シンボル': 'RYE'},
{'symbol': 'FENY'}, {'symbol': 'JHME'}, {'symbol': 'VDE'}, {'symbol': 'FILL'}, {'symbol': 'IYE'}, {'symbol': 'IXC'}, {'symbol': 'PXJ'}, {'symbol': 'FXN'}, {'symbol': 'NANR'}, {'symbol': 'MLPR'}, {'symbol': 'IGE'}, {'symbol': 'AMLP'}, {'symbol': 'AMZA'}]