如何使用python pandas的read_html读取带有多个tbodies的html表?

时间:2016-03-30 16:29:19

标签: python html pandas lxml

这是我的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> Col 2消失了。为什么?怎么预防呢?

2 个答案:

答案 0 :(得分:3)

您发布的HTML不是有效的。多个from .models import MyModel 是混淆tbody解析器逻辑的原因。如果您无法修复输入html本身,则必须预先解析它并"unwrap"所有pandas元素:

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])

答案 1 :(得分: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]