如何使用 python pandas' read_html 读取具有多个 tbodies 的 html table?
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 列消失。为什么?如何预防?
调用 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]
您发布的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
这是我的 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 列消失。为什么?如何预防?
调用 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]
您发布的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