繁体   English   中英

如何使用python pandas的read_html读取具有多个正文的html表?

[英]How to read an html table with multiple tbodies with python pandas' read_html?

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

您发布的HTML无效 多个tbody混淆了pandas解析器逻辑。 如果您无法修复输入html本身,则必须预先对其进行解析并“解包”所有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

当调用pd.read_html()时,具有多个tbody标签会引起问题。 在HTML5中,具有多个tbody标签是合法的,可以方便地进行样式设置,但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]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM