python - 从 XML 文档创建 DataFrame

标签 python xml pandas elementtree

我知道这个问题已经被问过几次了,但我已经尝试了一切都无济于事。我不确定这是一个边缘情况还是我遗漏了一些东西。我正在尝试解析 xml 文件并以 df 形式返回。以下是我的尝试:

import xml.etree.ElementTree as ET
import pandas as pd
from lxml import objectify
tree = ET.parse('file.xml')
root = tree.getroot()

  <?xml version="1.0"?>
 -<document page-count="1">
    -<page number="1">
       -<table data-table="1" data-page="1" data-filename="Schedule.pdf">
           -<tr>
                <td colspan="17">Wednesday 20th Mar</td>
           -</tr>
           -<tr>
                <td colspan="3" style="text-align: right">1</td>
                <td style="text-align: right">2</td>
                <td style="text-align: right">3</td>
                <td style="text-align: right">4</td>
                <td style="text-align: right">5</td>
                <td style="text-align: right">6</td>
                <td style="text-align: right">7</td>
                <td style="text-align: right">8</td>
                <td style="text-align: right">9</td>
                <td style="text-align: right">10</td>
                <td style="text-align: right">11</td>
                <td style="text-align: right">12</td>
                <td style="text-align: right">13</td>
                <td style="text-align: right">14</td>
                <td style="text-align: right">15</td>
            </tr>
           -<tr>
                <td>HOME</td>
                <td>D</td>
                <td/>
                <td/>
                <td>08:00</td>
                <td>09:00</td>
                <td>10:00</td>
                <td>11:00</td>
                <td>12:00</td>
                <td>13:00</td>
                <td/>
                <td/>
                <td/>
                <td colspan="4"/>
            </tr>            
        </table>
     </page>
  </document>

我可以将数据导出为字符串:

print(ET.tostring(root, encoding='utf8').decode('utf8'))

但是当尝试导出为 df 时,它会返回一个空帧:

xml = objectify.parse('file.xml')
root = xml.getroot()

data=[]
for i in range(len(root.getchildren())):
    data.append([child.text for child in root.getchildren()[i].getchildren()])

df = pd.DataFrame(data).T

输出:

      0
0  None

如果日期被删除,我希望预期输出将是:

         1      2      3      4      5      6      7      8 9 10 11 12 13 14 15
0  HOME  D      08:00  09:00  10:00  11:00  12:00  13:00                    

最佳答案

在示例 XML 中,第一个表第 10 行中的元素未关闭。如果已修复,您可以简单地执行以下操作(前提是您的 file.xml 被读取为字符串 a):

>>> pd.read_html(a, header=1)[0]
      1 1.1  1.2   2      3      4      5      6      7      8   9  10  11  12  13  14  15
0  HOME   D  NaN NaN  08:00  09:00  10:00  11:00  12:00  13:00 NaN NaN NaN NaN NaN NaN NaN

看起来在您的预期输出中,您将数据行 1 位置向右移动。

关于python - 从 XML 文档创建 DataFrame,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57520865/

相关文章:

python - 当两个用户同时输入时SQL会覆盖数据(Python)

Python itertools.combinations : how to obtain the indices of the combined numbers

python - 索引在 Pandas 中是如何工作的?

python - 使用另一列的最新值填充数据框列

python - 从表中的列查找值并在行中插入(python pandas scipy)

python - 对话框窗口选择文件的数量限制?

python - 在同一测试中模拟对同一功能的两个单独响应

android - 从 url 解析 xml。异常(exception)

C#读取父节点下的所有节点内部文本

java - 我看不到应用栏中的项目