Web ページをスクレイピングしていますが、情報をデータフレームにマッピングするのに問題があります。HTML にテーブルはありません。HTML の例を次に示します。
html= [
<h2>Event Title<h2>
<div class="row">
<h4>Category 1<h4>
<div>A<div>
<h4>Category 2<h4>
<div>B<div>
<h4>Category 3<h4>
<div>C<div>
<h4>Category 4<h4>
<div>D<div>
]
PythonでリクエストとBeautifulsoupを使用したコードは次のとおりです。
data = []
event = soup.find('h2')
for i in soup.find_all('div', {'class': 'row'}):
categories = [x.text for x in i.findAll('h4')]
info = [x.text for x in i.findAll('div')]
datum = {'event': event.get_text().replace('\n', '').replace('\r', ''),
'categories ': categories ,
'info ': info }
data.append(datum)
df = pd.DataFrame(data)
df
データフレームは、1 つのイベント タイトルと 2 つのリストのようになります。
index - event - categories - info
1 - Event Title - ['Category 1','Category 2','Category 3','Category 4'] - ["Category 1 \n A\n Category 2\n B\n Category 3\n C\n Category 4\n D\n"]
h4 カテゴリ 1 が div A に関連付けられるように、何らかの形でマッピングしてほしいと思います。
index - event - categories - info
1 - Event Title - Category 1 - A
2 - Event Title - Category 2 - B
3 - Event Title - Category 3 - C
4 - Event Title - Category 4 - D
h4 と div は親子ではなく兄弟であるため、Web スクレイプ コードでこれを分離することは可能ですか? イベントのタイトルが異なる複数のページがあり、データが大きすぎて手作業ではできません。
とりわけ、私も試しました:
data = []
event = soup.find('h2').get_text()
for i in soup.find_all('div', {'class': 'row'}):
categories = [x.text for x in soup.findAll('h4')]
cats = soup.find_all('h4')
cat = cats[3]
info = cat.findNextSiblings('div')
datum = {'event': event, 'categories ': categories , 'info': info}
data.append(datum)
df1 = pd.DataFrame(data)
df1
この結果から、次の df が得られます。
index - event - categories - info
1 - Event Title - ['Category 1','Category 2','Category 3','Category 4'] - [<div>A<div>, <div>B<div>, <div>C<div>, <div>D<div>]
要素を調べるためのウェブリンクは次のとおりです: https://www.ibjjfdb.com/ChampionshipResults/926/PublicResults
どんなアイデアでも役に立ちます。ありがとうございました!