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

2024-10-03 11:14:30 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个XML格式不正确,因为我在尝试读取XML时遇到以下错误:

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

我得到下面的错误

ParseError: not well-formed (invalid token): line 2034, column 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

他们有没有办法让我达到同样的目的?你知道吗


Tags: name标记importas错误descriptionxmlet
1条回答
网友
1楼 · 发布于 2024-10-03 11:14:30

因为您分别搜索namedescription标记,所以您无法知道哪个名称属于哪个描述。你知道吗

相反,您应该单独解析每个placemark标记,并处理每个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

相关问题 更多 >