0

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

どんなアイデアでも役に立ちます。ありがとうございました!

4

1 に答える 1