从一个文件列表中,如何找到一个特定标签列表与靓汤?

2024-03-28 16:30:55 发布

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

我有一个.xml文件目录,我对其中的某些特定部分感兴趣,例如:

  <element1>
    <elem1 id="e1" section="1" type="fruit" obj="156" pos="21" str="apple" />
    <elem2 id="e2" section="2" type="fruit" obj="236" pos="11" str="orange" />

    ....

    <elem_N id="N" section="N" type="Animal" obj="7476" pos="7" str="lion" />
  </element1>

如何将element1标记中的所有标记作为列提取到pandas数据帧中。类似这样的(*)

filename, elem id, section, type, obj, pos, str
filename1, elem1, 1, fruit, 156, 21, apple
filename2, elem2, 2, fruit, 236, 11, orange
...
filename_N, elem_N, N, Animal, 7476, 7, lion

到目前为止,我试图:

在:

import os, glob
from bs4 import BeautifulSoup

input_dir = glob.glob('../XML_FILES/*xml')

for e in input_dir:
    file_name = os.path.basename(e)[:-6] +'.txt'
    soup = BeautifulSoup(open(e),"lxml")
    element1 = soup.findAll('element1')
    print(file_name,element1)

上面的代码在列表中打印:filename和完整的elemN。但是,我不明白如何将它转换成一个数据帧。因此,如何获得(*)?你知道吗


Tags: posidobjappletypesectionxmlfilename
1条回答
网友
1楼 · 发布于 2024-03-28 16:30:55

您可以通过一个接一个地解析文件来解决这个问题,将结果收集到一个字典列表收集elem*标记名和属性值。最后,实例化一个DataFrame实例:

import glob
import re

from bs4 import BeautifulSoup
import pandas as pd


data = []
for filename in glob.glob('*.xml'):
    soup = BeautifulSoup(open(filename), "lxml")

    for element in soup(re.compile(r"^elem[0-9]+")):
        data.append({**element.attrs, **{'filename': filename, 'elem id': element.name}})

df = pd.DataFrame(data)
print(df)

下面是我执行脚本时它的输出:

  elem id   filename  id   obj pos section     str    type
0   elem1  input.xml  e1   156  21       1   apple   fruit
1   elem2  input.xml  e2   236  11       2  orange   fruit
2   elem3  input.xml   N  7476   7       N    lion  Animal

您甚至可以使用列表理解在单行中构造data列表,但这可能会对程序的可读性产生负面影响:

data = [
    {**element.attrs, **{'filename': filename, 'elem id': element.name}}
    for filename in glob.glob('*.xml')
    for element in BeautifulSoup(open(filename), "lxml")(re.compile(r"elem[0-9]+"))
]

相关问题 更多 >