GENERAL XML OUTLINE:
<dasbhoards>
<dashboard name="S1>
<repository-location derived-from='http://dataviz.win.compete.com/workbooks/OTCSurvey_06_15_11_16_54/RT4?rev=' id='RT4' path='/workbooks/RetailFootwear' revision='' />
<style>
</style>
<zones>
<zone h='92975' id='4' param='horz' type='layout-flow' w='87842' x='12158' y='7025'>
<zone h='92975' id='2' type='layout-basic' w='77953' x='12158' y='7025'>
<zone h='92975' id='1' name='RT4_stk_bar_grid' w='77953' x='12158' y='7025'>
</zone>
</zone>
<zone fixed-size='170' h='92975' id='3' is-fixed='true' param='vert' type='layout-flow' w='9889' x='90111' y='7025'>
<zone h='13739' id='6' name='RT4_stk_bar_grid' param='[mysql.40611.854150011575].[none:response:nk]' type='color' w='9889' x='90111' y='7025'>
</zone>
</zone>
</zone>
<zone h='7025' id='7' name='Q-RT4' w='87842' x='12158' y='0'>
</zone>
<zone h='100000' id='9' param='vert' type='layout-flow' w='12158' x='0' y='0'>
<zone h='6818' id='5' name='RT4_stk_bar_grid' param='[mysql.40611.854150011575].[none:crosstab_group:nk]' type='filter' w='12158' x='0' y='0'>
</zone>
<zone h='31921' id='10' name='RT4_stk_bar_grid' param='[mysql.40611.854150011575].[none:question_base:nk]' type='filter' w='12158' x='0' y='6818'>
</zone>
</zone>
</zones>
</dashboard>
<dashboard name="S2">
<more tags>
</dashboard>
</dashboards>
这是我美丽的汤项目的工作流程。我找到所有仪表板元素并使用extract()删除所有没有“s1”作为属性“name”的值。 但问题是,在写作之前似乎所有的仪表板元素都从最终的汤中删除了。 难道我做错了什么? 请注意,有一个名称为“S1”的仪表板元素。
#load the xml
workbook = open("C:\\Users\\rabdel.WINCMPT\\Documents\\Retail Footwear.twb")
soup = BeautifulStoneSoup(workbook, selfClosingTags=['repository-location', 'style'])
workbook.close()
#get all "dashboard" elements (children of "dashboards")
d = soup.findAll('dashboard')
#extract all but one
for child in d:
if child.get("name", "").lower() != "s1":
child.extract()
#write out the results
modified_workbook = open("C:\\Users\\rabdel.WINCMPT\\Documents\\Footwear.xml", "w")
modified_workbook.write(soup.prettify())
modified_workbook.close()
更多信息: 最有趣的是,如果我在提取之前和之后将仪表板(父)元素写入文件,我会得到我所期望的。问题是汤本身似乎有所不同。
答案 0 :(得分:2)
您的代码看起来不错。如果没有看到XML文件,就无法确定为什么没有得到预期的结果。
您可能希望在循环中添加调试行,例如:
for child in d:
name = child.get('name', '').lower()
print 'Name: "{0}"; Equal to "s1": {1}'.format(name, name == 's1')
...并确保真的是一个带有您正在寻找的名称的标签!
答案 1 :(得分:0)
这似乎实际上不是一个BeautifulSoup问题。问题在于,生成的XML未被应用程序(Tabeleau)识别为有效的xml。