【发布时间】:2021-10-23 01:21:16
【问题描述】:
我有许多带有无关标签的 gpx (XML) 文件,这些标签毫无用处,我想删除它们,然后重写文件。
使用 BeautifulSoup (v4) 打开和解析它们是微不足道的,但我现在正在尝试寻找如何删除标签。
在给出的示例片段中,我要删除的标签是trkseg 中的整个<name>n</name>(其中n 是整数)标签。 (即不仅仅是价值)
<?xml version="1.0" encoding="utf-8"?>
<gpx version="1.1">
<metadata>
<name>A Name</name>
<desc>A Description</desc>
<author>
<name>Another Name</name>
<email>emailaddr@nonexistentdomain.com</email>
</author>
<time>2018-10-27T17:58:45Z</time>
</metadata>
<trk>
<desc>
"Walk Number", "Start Date", "Start Time", "Elapsed Time", "Miles","Kilometers", "Steps", "Calories"
2,"27 Oct 2018","1:18:05 pm","4 hours15 minutes29 seconds",13.37,21.52,33436,1,212
</desc>
<trkseg>
<name>2</name>
<trkpt lat="32.01333283" lon="-28.61624884">
<ele>274.0</ele>
<time>2018-10-27T13:18:05Z</time>
</trkpt>
<name>2</name>
<trkpt lat="32.01325155" lon="-28.61617729">
<ele>260.0</ele>
<time>2018-10-27T13:18:32Z</time>
</trkpt>
<name>2</name>
<trkpt lat="32.01317277" lon="-28.6162623">
<ele>264.0</ele>
<time>2018-10-27T13:18:38Z</time>
</trkpt>
<name>2</name>
<trkpt lat="32.01308939" lon="-28.61634673">
<ele>272.0</ele>
<time>2018-10-27T13:18:46Z</time>
</trkpt>
<name>2</name>
<trkpt lat="32.01300121" lon="-28.61649587">
<ele>270.0</ele>
<time>2018-10-27T13:18:54Z</time>
</trkpt>
</trkseg>
</trk>
</gpx>
关于 SO 和其他地方删除标签的答案似乎与此用例不匹配,我还没有发现 BS 文档有帮助(我确定是我的缺陷而不是文档的缺陷)。
(因为文件相当简单且格式一致,我可以使用 awk 或 sed 删除这些标签,但我想知道如何在BS,以防我将来遇到不那么简单的事情)
不管怎样,我只做到了这一点:
# "gpx" is the data fragment given above
from bs4 import BeautifulSoup as BS
gpxml = BS(gpx, 'xml')
# and I can do this to find all the unwanted tags in <trkseg>
unwanted = gpxml.trkseg.name
print(unwanted)
[<name>2</name>, <name>2</name>, <name>2</name>, <name>2</name>, <name>2</name>]
# and I can do this to iterate the trkseg and print trkpt & name by turn
for el in gpxml.trkseg:
print(el)
但在这一点上,我已经无法理解了。
我想我可能需要以某种方式使用 BeautifulSoup 的 decompose() 方法?
我使用 BeautifulSoup 是因为我发现 lxml.etree 更难理解(无论从职业还是性质来看,我都不是程序员)
【问题讨论】:
标签: python xml beautifulsoup