提问人:x89 提问时间:1/23/2023 最后编辑:HedgeHogx89 更新时间:1/25/2023 访问量:281
如何将单个标签中具有多个属性值的XML解析为DataFrame?
How to parse XML with multiple attribute values within a single tag to DataFrame?
问:
<?xml version="2.0" encoding="UTF-8" ?><timestamp="20220113">
<defintions>
<defintion id="1" old_id="0">Lang</defintion>
<defintion id="7" old_id="1">Eng</defintion>
如何解析如下所示的 XML 文件?在这里,我在单个标签中有多个值。我想以 or 格式提取“ID”和“OLD_ID”等值。list
dataframe
答:
0赞
Francisco Rodrigues
1/23/2023
#1
使用 python Beautiful Soup,您可以将 .xml 文件解析为 Beatuful soup 对象,然后使用 .findAll('defintions')。 然后遍历您找到的标签并获取所需的值
object.findAll('defintions')
for defintion in defintions:
old_id = defintions['old_id']
id = defintions['id']
参考资料: https://www.crummy.com/software/BeautifulSoup/bs4/doc/ https://linuxhint.com/parse_xml_python_beautifulsoup/
评论
0赞
x89
1/23/2023
如果您正在从文件中读取内容,您如何定义“对象”?
0赞
HedgeHog
1/23/2023
在较新的代码中,避免使用旧语法,而是使用 or with - 有关更多信息,请花一分钟时间查看文档findAll()
find_all()
select()
css selectors
0赞
Francisco Rodrigues
1/24/2023
使用 open('teachers.xml', 'r') 作为 f: file = f.read() # 'xml' 是使用的解析器。对于 BeautifulSoup 通常用于的 html 文件,它将是“html.parser”。soup = BeautifulSoup(file, 'xml') ref : stackabuse.com/parsing-xml-with-beautifulsoup-in-python
2赞
HedgeHog
1/23/2023
#2
您可以使用 和 xml
解析器来实现您的目标,只需选择所需的元素并通过 迭代以提取属性值。BeautifulSoup
ResultSet
.get()
with open('filename.xml', 'r') as f:
file = f.read()
soup = BeautifulSoup(file, 'xml')
例
from bs4 import BeautifulSoup
import pandas as pd
xml = '''<?xml version="2.0" encoding="UTF-8" ?><timestamp="20220113">
<defintions>
<defintion id="1" old_id="0">Lang</defintion>
<defintion id="7" old_id="1">Eng</defintion>
'''
soup = BeautifulSoup(xml,'xml')
pd.DataFrame(
[
(e.get('id'),e.get('old_id'))
for e in soup.select('defintion')
],
columns = ['id','old_id']
)
输出
编号 | old_id | |
---|---|---|
0 | 1 | 0 |
1 | 7 | 1 |
评论
0赞
x89
1/23/2023
您还能帮助第二个用例吗?在这种情况下,我需要提取一个组合:一个标签的属性(即像我们之前所做的那样提供),一些标签本身的内容(例如级别、名称),然后是第一个标签的属性(时间戳),其值将在所有字段中重复。我编辑了qs
0赞
HedgeHog
1/23/2023
为了保持原始问题的干净,这注定要提出一个具有确切重点的新问题 - 只需在评论中删除链接即可参考您的新答案。会很棒
0赞
x89
1/23/2023
stackoverflow.com/questions/75210241/......
0赞
Hermann12
1/25/2023
#3
如果你有一个有效的 XML,比如(timestamp 标签不能有像属性这样的值):
<?xml version='1.0' encoding='utf-8'?>
<root timestamp='20220113'>
<defintions>
<defintion id="1" old_id="0">Lang</defintion>
<defintion id="7" old_id="1">Eng</defintion>
</defintions>
</root>
比你可以用:pandas
import pandas as pd
df = pd.read_xml('x89.xml', xpath='.//defintion')
print(df.to_string(index=False))
输出:
id old_id defintion
1 0 Lang
7 1 Eng
评论