从 XML 文档创建 DataFrame
Creating DataFrame from XML document
我知道这个问题已经被问过几次了,但我已经尝试了所有方法都无济于事。我不确定这是边缘情况还是我遗漏了什么。我正在尝试将 xml 文件和 return 解析为 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 时,它 return 是一个空框架:
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 行 table 中的元素未关闭。如果已修复,您可以简单地执行(前提是您的 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 的位置向右移动了。
我现在没有 Pandas,但我想你可以试试这个代码来获取你的 data
import xml.etree.ElementTree as ET
xml = ET.parse('file.xml')
root = xml.getroot()
data = []
for child in root.iter('td'):
data.append(child.text)
我知道这个问题已经被问过几次了,但我已经尝试了所有方法都无济于事。我不确定这是边缘情况还是我遗漏了什么。我正在尝试将 xml 文件和 return 解析为 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 时,它 return 是一个空框架:
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 行 table 中的元素未关闭。如果已修复,您可以简单地执行(前提是您的 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 的位置向右移动了。
我现在没有 Pandas,但我想你可以试试这个代码来获取你的 data
import xml.etree.ElementTree as ET
xml = ET.parse('file.xml')
root = xml.getroot()
data = []
for child in root.iter('td'):
data.append(child.text)