使用 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
操纵路径,使其跨平台工作。
我正在尝试使用 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
操纵路径,使其跨平台工作。