Я понимаю, что этот вопрос задавался несколько раз, но я попробовал все безрезультатно. Я не уверен, что это крайний случай или я что-то упустил. Я пытаюсь разобрать 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                    
1
Chopin 16 Авг 2019 в 10:56

2 ответа

Лучший ответ

У меня сейчас нет панд, но я думаю, что вы можете попробовать этот код, чтобы получить 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)
1
lpozo 3 Сен 2019 в 19:16

В примере 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 позицию вправо.

1
crayxt 3 Сен 2019 в 04:32