我有一个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
标签及其中的信息。我想捕获每个标签的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
他们以任何方式实现同样的目标吗?
由于您正在分别搜索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