【问题标题】:Beautiful Soup extract() problemBeautiful Soup extract() 问题
【发布时间】:2011-10-09 11:59:28
【问题描述】:

一般 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()

更多信息: 最有趣的是,如果我在提取之前和之后将仪表板(父)元素写入文件,我得到的正是我所期望的。问题是汤本身似乎不一样。

【问题讨论】:

  • 您正在检查代码中的“s1”,但您在帖子中说的是“S1”。区分大小写?
  • 进行不区分大小写的检查:child.get("name", "").lower() != "s1"

标签: python beautifulsoup


【解决方案1】:

您的代码看起来不错。如果不查看您的 XML 文件,就不可能知道为什么没有得到预期的结果。

您可能希望在循环中添加调试行,例如:

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

...并确保 真的 有一个带有您要查找的名称的标签!

【讨论】:

  • 当我在等待答案时,这正是我所做的。我确实看到了“S1”。不过,我想我的问题是为什么它会删除父标签?即使没有符合条件的子元素,也不应该让父元素保持完整(但为空)吗?
  • 另外,xml 文件非常大,所以(除非有办法将文件附加到 Stack),我无法与您共享文件。
  • 不共享文件,您能否概述一下文件中的标签层次结构?也许您正在测试错误的标签?从您的代码中,您尝试提取所有 不 具有属性 name 且值为 s1(不区分大小写)的 dashboard 标签。
  • 添加了 xml 描述。缩进可能有点偏离,但仍然应该传达这个想法。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2023-03-13
    • 2016-01-09
    • 1970-01-01
    • 2014-08-10
    • 1970-01-01
    • 1970-01-01
    • 2020-12-04
    • 2018-11-26
    • 1970-01-01
    相关资源
    最近更新 更多