2016-03-30 42 views
2

這是我的html:如何用python熊貓的read_html讀取多個tbody的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 s是混淆了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

當調用pd.read_html()時,具有多個tbody標記會導致問題。擁有多個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