使用 Python 中的 BeautifulSoup 识别和替换 XML 的元素

Identify and replace elements of XML using BeautifulSoup in Python

我正在尝试使用 BeautifulSoup4 查找和替换 XML 中的特定元素。更具体地说,我想找到 'file_name' 的所有实例(在下面的示例中,文件名是 'Cyp26A1_atRA_minus_tet_plus.txt')并将其替换为该文档的完整路径——保存在 'file_name_replacement_dir' 多变的。我的第一个任务,也是我坚持的一点,是隔离感兴趣的部分,以便我可以使用 replaceWith() 方法替换它。

XML

      <ParameterGroup name="Experiment_22">
        <Parameter name="Data is Row Oriented" type="bool" value="1"/>
        <Parameter name="Experiment Type" type="unsignedInteger" value="0"/>
        <Parameter name="File Name" type="file" value="Cyp26A1_atRA_minus_tet_plus.txt"/>
        <Parameter name="First Row" type="unsignedInteger" value="1"/>

实际上有 44 个实验,有 4 个不同的文件名(所以 11 个文件名为 1,11 个文件名为 2,依此类推)。所以上面的 XML 片段重复了 44 次,只是在 "File Name" 行中存储了不同的文件。

到目前为止我的代码

xml_dir = 'D:\MPhil\Model_Building\Models\Retinoic_acid\[06]\RAR_Models\Model_Line_2'
xml_file_name = 'RARa_RXR_M22.cps'
xml=model_dir+'\'+model_name
file_name_replacement_dir = D:\MPhil\Model_Building\Models\Retinoic_acid\[06]\RAR_Models
soup = BeautifulSoup(open(xml))
print soup.find_all('parametergroup name="Experiment_22"')

然而 returns 这是一个空列表。我还尝试了一些其他函数来代替 'soup.findall()' 但仍然无法找到文件名的句柄。有人知道如何做我想做的事吗?

您 find_all 的选择器是错误的,您需要像这样分隔标签名称和属性:

find_all("Parameter",{'name':'File Name'})

这将直接为您获取所有文件名标签。如果你真的需要父标签,那么在没有属性字典的情况下传入 "ParameterGroup"。

不确定 BeautifulSoup 是否需要小写您的标签,您可能需要尝试一下。

xml = '<ParameterGroup name="Experiment_22">\
<Parameter name="Data is Row Oriented" type="bool" value="1"/>\
<Parameter name="Experiment Type" type="unsignedInteger" value="0"/>\
<Parameter name="File Name" type="file" value="Cyp26A1_atRA_minus_tet_plus.txt"/>\
<Parameter name="First Row" type="unsignedInteger" value="1"/>\
</ParameterGroup>'

from bs4 import BeautifulSoup
import os
soup = BeautifulSoup(xml)

for tag in soup.find_all("parameter", {'name': 'File Name'}):
    tag['value'] = os.path.join('new_dir', tag['value'])

print soup
  • 关闭您的 XML 'ParameterGroup' 标签。
  • 标签不能大写 使用 BeautifulSoup,尝试使用小写 parameter
  • 使用 os.path 操纵路径,使其跨平台工作。