Beautiful Soup extract() 问题

1 投票
2 回答
854 浏览
提问于 2025-04-16 21:56

一般的XML结构:

<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>

这是我在做Beautiful Soup项目时的工作流程。我找到所有的仪表盘元素,然后用extract()方法把那些属性“name”的值不是"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()

更多信息:最有趣的是,如果我在提取前后把仪表盘(父)元素写入文件,我得到的结果正是我期待的。问题在于,最终的结果似乎和我想要的不同。

2 个回答

2

你的代码看起来没问题。不过,光凭这些信息很难判断为什么你得不到预期的结果,因为我们看不到你的XML文件。

你可以在循环里加一行调试代码,比如:

for child in d:
    name = child.get('name', '').lower()
    print 'Name: "{0}"; Equal to "s1": {1}'.format(name, name == 's1')

...并确保真的有一个你要找的标签存在哦!

0

这看起来其实不是BeautifulSoup的问题。问题在于生成的XML没有被应用程序(Tabeleau)识别为有效的XML。

撰写回答