python
  • beautifulsoup
  • 2011-07-20 131 views 1 likes 
    1

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

    这里是我美丽的汤项目的工作流程。我找到所有的仪表板元素,并使用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

    您正在检查代码中的“s1”,但您在帖子中说“S1”。区分大小写? – James

    +0

    做一个不敏感的检查:当我在等待答案时,这正是我所做的,而不是检查:child.get(“name”,“”).lower()!=“s1” – Ramy

    回答

    0

    这似乎并不是BeautifulSoup问题。问题在于,正在生成的XML没有被应用程序(Tabeleau)识别为有效的xml。

    2

    你的代码看起来没问题。不可能告诉你为什么没有看到你的XML文件就没有得到预期的结果。

    您可能要调试行添加到您的回路等,如:

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

    ...,并确保有真的是你正在寻找的名称的标签!

    +0

    。我看到一个“S1”。我想我的问题是,为什么它会删除父标签?即使没有符合条件的子元素,它是否不应该使父元素保持机智(但为空)? – Ramy

    +0

    此外,xml文件真的非常大(除非有办法将文件附加到堆栈),我无法真正与您共享文件。 – Ramy

    +0

    而不是共享该文件,您能否给出文件中标签层次结构的概述?也许你正在测试错误的标签?从你的代码中,你试图提取所有'dashboard'标签,它们*不具有属性'name',其值为's1'(不区分大小写)。 –

    相关问题