前提・実現したいこと
取得したhtmlのtableについて,ブラウザ表示上の対応関係を維持したPythonデータフレーム形式のデータの出力を試みています。
以下で説明するようにHanako SuzukiのBiographyにおけるJun.2007とTakahashi Corp. CEOの対応関係が維持されたデータフレーム形式のデータを出力したいです。
発生している問題・エラーメッセージ
ブラウザ表示すると分かるように,抽出したtableのBiography列(colspan=2)の年月セル(Apr.1962など)と内容セル(Joined our companyなど)は隣り合わせで対応しています。
しかし,htmlコードでは各tdタグのなかでpタグで改行しているだけであり,明確に対応関係が表現されているわけではありません。
そのため,以下のpandasおよびBeautifulSoupを活用したPythonコードから出力されたデータフレーム形式(変数名table)では,年月セルと内容セルの内容がそれぞれ一つの要素として結合されており,対応関係が失われてしまいました。
特に,Hanako SuzukiのBiographyではもともとJun。2007にGeneral ManagerとTakahashi Corp. CEOという2つの情報が対応していたのですが,出力されたデータフレーム形式ではその関係性を復元することが困難になっています。
該当のソースコード
html
1<html lang="en"> 2<head> 3 <meta charset="utf-8"> 4</head> 5 6<body> 7 <div> 8 <h2>Directors</h2> 9 <table border="1"> 10 <tbody> 11 <tr> 12 <td> 13 <p>Position1</p> 14 </td> 15 <td> 16 <p>Position2</p> 17 </td> 18 <td> 19 <p>Name</p> 20 </td> 21 <td> 22 <p>Date of Birth</p> 23 </td> 24 <td colSpan="2"> 25 <p>Biography</p> 26 </td> 27 <td> 28 <p>Number of Shares</p> 29 <p>(thousands)</p> 30 </td> 31 </tr> 32 <tr> 33 <td> 34 <p>Executive Director</p> 35 <p>President</p> 36 </td> 37 <td> 38 <p>CEO</p> 39 </td> 40 <td> 41 <p>Taro Yamada</p> 42 </td> 43 <td> 44 <p>9/17/1940</p> 45 </td> 46 <td> 47 <p> Apr. 1962</p> 48 <p> Aug. 1989</p> 49 <p> Jun. 1991</p> 50 <p> Jun. 1997</p> 51 <p> Jun. 2000</p> 52 <p> Jun. 2005</p> 53 </td> 54 <td> 55 <p>Joined our company</p> 56 <p>President of Tokyo branch</p> 57 <p>Director</p> 58 <p>Managing Director</p> 59 <p>Senior Managing Director</p> 60 <p>Executive Director</p> 61 </td> 62 <td> 63 <p>18</p> 64 </td> 65 </tr> 66 <tr> 67 <td> 68 <p>Managing Director</p> 69 </td> 70 <td> 71 <p>CFO</p> 72 </td> 73 <td> 74 <p>Hanako Suzuki</p> 75 </td> 76 <td> 77 <p>3/29/1947</p> 78 </td> 79 <td> 80 <p> Apr. 1970</p> 81 <p> Jun. 2005</p> 82 <p> Jun. 2007</p> 83 <p> 84 <font> </font> 85 </p> 86 <p> 87 <font> </font> 88 </p> 89 <p> Jun. 2009</p> 90 <p> May. 2011</p> 91 </td> 92 <td> 93 <p>Joined our company</p> 94 <p>Manager</p> 95 <p>General Manager</p> 96 <p>Takahashi Corp.</p> 97 <p>CEO</p> 98 <p>Director</p> 99 <p>Managing Director</p> 100 </td> 101 <td> 102 <p>10</p> 103 </td> 104 </tr> 105 </tbody> 106 </table> 107 </div> 108</body> 109 110</html> 111
python
1import pandas as pd 2from bs4 import BeautifulSoup 3import html5lib 4import lxml 5 6with open("test_en.html") as f: 7 soup = BeautifulSoup(f, "lxml") 8 9tables = soup.find_all("table") 10table_list = pd.read_html(str(tables)) 11 12for i in range(len(table_list)): 13 table_list[i].columns = table_list[i].loc[0,] 14 table_list[i] = table_list[i].drop(table_list[i].index[0]) 15 16table = table_list[0] 17print(table)
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/06/17 07:19