从格式不正确的XML中获取列名

问题描述 投票:0回答:1

我有一个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')

如果我打印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标签及其中的信息。我想捕获每个标签的namedescription,并制作各自列的df

我的代码是:

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

问题是一些Placemark标签我根本没有namedescription标签。因此我无法知道哪个名称有什么描述。因此,由于没有标签,名称和描述之间存在不匹配。

预期产出数据框:

Name      Description
India     Country
USA
           City

他们以任何方式实现同​​样的目标吗?

python pandas beautifulsoup xml-parsing
1个回答
2
投票

由于您正在分别搜索namedescription标签,因此您无法追踪哪个名称属于哪种描述。

相反,你应该自己解析每个placemark标签,并处理每个地标标签缺少namedescription标签的情况。

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
© www.soinside.com 2019 - 2024. All rights reserved.