beautifulSoup
次の構造を持つHTMLを使用して解析しようとしています。
<table>
<tr><td class="title">Title 2</td></tr>
</table>
<table>
<tr><td>Label 1</td><td>Label 2</td><td>Label 3</td></tr>
<tr><td class="data">Data 1</td><td class="data">Data 2</td><td class="data">Data33</td></tr> </table>
<table>
<tr><td class="title">Title 2</td></tr>
</table>
<table>
<tr><td>Label 1</td><td>Label 2</td><td>Label 3</td></tr>
<tr><td class="data">Data 1</td><td class="data">Data 2</td><td class="data">Data33</td></tr>
</table>
私が抱えている問題は、データフレームのデータと同じ行にタイトルを追加したいということです。しかし、forループ(テーブルの検索に基づく)を使用すると、タイトルをデータポイントと同じリストに入れる方法がわかりません。そのため、データフレームに入るデータは[ title, Data 1, Data 2, Data 3
]になります。
Pythonコードは次のとおりです。
tables = soup.find_all('table')
i = 0
for t in tables:
if(i % 2) == 1:
datapoints = t.find_all('td', class_='data')
data = []
for d in datapoints:
data.append(d.text)
i += 1
else:
title = t.find('td', class_='title').text
i += 1
別のforループでラップしようとしましたが、テーブルをループする必要があるため、機能しません。
2つのデータフレーム(1つはタイトル用、もう1つはデータ用)を作成し、最後にそれらをマージすることもできますが、それが最善の方法であるとしたら驚きます。
2つのforループのセットの結果をマージする方法を知っている人はいますloop n and n+1
か(つまり)?
を使用するのはどうですかtry..except
:
for table in soup.find_all('table'):
try:
title = table.find('td', class_='title').text
except AttributeError: # Triggers if no title present
data = [td.text for td in table.find_all('td', class_='data')]
あなたが望むリストを取得することに関して:
data = []
for table in soup.find_all('table'):
try:
data.append([table.find('td', class_='title').text])
except AttributeError: # Triggers if no title present
data[-1].extend(td.text for td in table.find_all('td', class_='data'))
print(data)
# [['Title 1', 'Data 1', 'Data 2', 'Data33'],
# ['Title 2', 'Data 1', 'Data 2', 'Data33']]
これは、タイトルの直後に対応するデータを含むテーブルが続く限り機能します。
ただし、pandas.DataFrame
後で追加する場合は、おそらくこれが簡単です。
import pandas as pd
titles, data = [], []
for table in soup.find_all('table'):
try:
titles.append(table.find('td', class_='title').text)
except AttributeError: # Triggers if no title present
data.append([td.text for td in table.find_all('td', class_='data')])
df = pd.DataFrame(zip(*data), columns=titles)
# df = pd.DataFrame.from_items(zip(titles, data)) # also works
print(df)
# Title 1 Title 2
# 0 Data 1 Data 1
# 1 Data 2 Data 2
# 2 Data33 Data33
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加