【问题标题】:How to read an html table with multiple tbodies with python pandas' read_html?如何使用 python pandas 的 read_html 读取具有多个 tbodies 的 html 表?
【发布时间】:2016-07-18 19:06:47
【问题描述】:

这是我的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

Col 2 消失。为什么?如何预防?

【问题讨论】:

    标签: python html pandas lxml


    【解决方案1】:

    您发布的 HTML 无效。多个tbodys 混淆了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
    

    【讨论】:

      【解决方案2】:

      当调用 pd.read_html() 时,有多个 tbody 标签会导致问题。拥有多个 tbody 标签在 html5 中是合法的,并且可以方便地进行样式设置,但 pd.read_html() 似乎不支持它。但是,如果您可以只使用单个 &lt;tbody&gt; 就可以了。

      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]
      

      【讨论】:

      • html 不是我的代码。我可能会用 Beautifulsoup 阅读 html 并在用 pandas 阅读之前删除所有 tbodies。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-27
      • 1970-01-01
      • 2017-03-26
      • 2022-11-25
      • 1970-01-01
      • 2017-01-07
      相关资源
      最近更新 更多