2016-03-30 14 views
2

これは私のhtmlです:python pandas 'read_htmlで複数のtbodiesを持つhtmlテーブルを読むには?

import pandas as pd  
html_table = '''<table> 
         <thead> 
         <tr><th>Col1</th><th>Col2</th> 
         </thead> 
         <tbody> 
         <tr><td>1a</td><td>2a</td></tr> 
         </tbody> 
         <tbody> 
         <tr><td>1b</td><td>2b</td></tr> 
         </tbody> 
        </table>''' 

私はdf = pd.read_html(html_table)を実行し、print(df[0]場合は私が手:

Col1 Col2 
0 1a 2a 

コル2が消滅します。どうして?それを防ぐ方法は?

答えて

1

あなたが投稿したHTMLは、有効なものではありません。 tbodyが複数あると、パーサーロジックpandasが混乱します。あなたが入力HTML自体を修正することができない場合、あなたはそれを事前に解析する必要がと"unwrap"すべてtbodyの要素:

import pandas as pd 
from bs4 import BeautifulSoup 

html_table = ''' 
<table> 
    <thead> 
    <tr><th>Col1</th><th>Col2</th> 
    </thead> 
    <tbody> 
    <tr><td>1a</td><td>2a</td></tr> 
    </tbody> 
    <tbody> 
    <tr><td>1b</td><td>2b</td></tr> 
    </tbody> 
</table>''' 

# fix HTML 
soup = BeautifulSoup(html_table, "html.parser") 
for body in soup("tbody"): 
    body.unwrap() 

df = pd.read_html(str(soup), flavor="bs4") 
print(df[0]) 

プリント:

Col1 Col2 
0 1a 2a 
1 1b 2b 
0

複数のtbodyタグを持つと、pd.read_html()が呼び出されたときに問題が発生します。複数のtbodyタグを持つことはhtml5では合法であり、スタイリングには便利ですが、pd.read_html()でサポートされていないようです。しかし、あなたがただ一つの<tbody>を使うことができればそれはうまく動作します。

html_table1 = '''<table> 
       <thead> 
       <tr><th>Col1</th><th>Col2</th> 
       </thead> 
       <tbody> 
       <tr><td>1a</td><td>2a</td></tr> 
       <tr><td>1b</td><td>2b</td></tr> 
       </tbody> 
      </table>''' 

df1 = pd.read_html(html_table1) 
print(df1) 
[ Col1 Col2 
0 1a 2a 
1 1b 2b] 
+0

HTMLは私のコードではありません。私はBeautifulsoupでhtmlを読んで、パンダで読む前にすべてのtbodiesを削除するかもしれません。 – foebu