如何将单个标签中具有多个属性值的XML解析为DataFrame?

How to parse XML with multiple attribute values within a single tag to DataFrame?

提问人:x89 提问时间:1/23/2023 最后编辑:HedgeHogx89 更新时间:1/25/2023 访问量:281

问:

<?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”等值。listdataframe

python-3.x beautifulsoup xml解析

评论

0赞 HedgeHog 1/23/2023
回滚版本导致以下提供的其他问题:stackoverflow.com/questions/75210241/...谢谢

答:

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 解析器来实现您的目标,只需选择所需的元素并通过 迭代以提取属性值。BeautifulSoupResultSet.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赞 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