Получить имена столбцов из не правильно сформированного XML - PullRequest
0 голосов
/ 30 апреля 2019

У меня есть XML, который плохо сформирован, так как я получаю эту ошибку при попытке прочитать XML:

import xml.etree.ElementTree as ET
ET.parse(r'my.xml')

Я получаю приведенную ниже ошибку

ParseError: неправильно сформирован (неверный токен): строка 2034, столбец 317

Итак, я использовал BeautifulSoup, чтобы прочитать xml по следующему коду:

from bs4 import BeautifulSoup

with open(r'my.xml') as fp:
    soup = BeautifulSoup(fp, 'xml')

Если яprint soup это выглядит так:

        <Placemark> 
<name>India </name> 
    <description>Country</description> 
    <styleUrl>#icon-962-B29189</styleUrl> 
    </Placemark>
        <Placemark> 
<name>USA</name>   
    <styleUrl>#icon-962-B29189</styleUrl> 
    </Placemark>            
    <Placemark>   
    <description>City</description> 
    <styleUrl>#icon-962-B29189</styleUrl> 
    </Placemark>

У меня есть более 100 Placemark тегов и информация в них.Я хочу захватить name и description каждого тега и сделать df с соответствующими столбцами.

Мой код для этого же:

name_tag=[x.text.strip() for x in soup.findAll('name')]
description_tag =[x.text.strip() for x in soup.findAll('description')]

Проблема для некоторыхиз тегов Placemark У меня нет тега name или description.И поэтому я не могу знать, какое имя имеет какое описание.Таким образом, существует несоответствие между именем и описанием из-за отсутствия тегов.

Ожидаемый выходной фрейм данных :

Name      Description
India     Country
USA
           City

В любом случае я могу добиться того же

1 Ответ

2 голосов
/ 30 апреля 2019

Поскольку вы ищете теги name и description по отдельности, вы теряете дорожку того, какое имя принадлежит какому описанию.

Вместо этого вы должны проанализировать каждый тег placemark самостоятельно,и обработать случай отсутствия тегов name и description для каждого тега метки.

data = []

for placemark in soup.findAll('placemark'):
    try:
        name = placemark.find('name').text.strip()
    except AttributeError:
        name = None
    try:
        description = placemark.find('description').text.strip()
    except AttributeError:
        description = None

    data.append((name, description))

df = pd.DataFrame(data, columns=['Name', 'Description'])
print(df)
#       Name    Description
#  0   India        Country
#  1     USA           None
#  2    None           City
...