【问题标题】:From a list of files, how to find a list of specific tags with beautiful soup?从文件列表中,如何找到带有美汤的特定标签列表?
【发布时间】:2017-11-29 17:51:12
【问题描述】:

我有一个 .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 标签内的列提取到熊猫数据框中。像这样(*):

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。但是,我不明白如何将其转换为熊猫数据框。那么,我怎样才能得到(*)

【问题讨论】:

标签: python python-3.x beautifulsoup lxml


【解决方案1】:

您可以通过逐个解析文件来解决问题,将结果收集到一个字典列表中,一路收集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]+"))
]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-06-24
    • 2016-08-29
    • 2020-06-25
    • 1970-01-01
    • 2017-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多