BeautifulSoup直接进入第一个孩子的孩子,而不是直接指导孩子

时间:2014-01-17 12:31:22

标签: python xml beautifulsoup

我正在尝试获取加载到BS对象的xml文件中的特定标记,但是当我到达特定标记时,当我尝试访问使用方括号的子项时,BS会进入第一个孩子[]”。

例如,给定下面的xml,我应该使用这个python代码到达conditionalBlocks:

reportPages = reportpages.findAll('page')

for reportPage in reportPages:
    contents = reportPage.findAll('pagebody')[0].find_all('contents') #[0].findAll()
    print "contents; ", contents
    conditionalBlocks = contents[0].find_all('conditionalBlocks')
    print "conblox; ", conditionalBlocks

现在在print "contents, "...我得到输出:

<contents>
   <textitem>
     <datasource>
        <staticvalue>Foods Management Guide for </staticvalue>
     </datasource>
     <style>
        <defaultStyles>
        <defaultStyle refStyle="wwtxtt"/>
     </style>
   </textitem>
</contents>

据我所知,这是不完整的;它只包含内容标记中第一个textItem标记的内容,而不包含其后的其他标记

print "conblox; ", ...处的行我得到了输出; conblox; [] 说找不到conditionalBlocks标签,其中;如果我看一下正在读入的xml(见下文);是不可能的。

我无法理解它是如何找到第一个标签,而不是其他标签,即:conditionalBlocks。 有人可以帮忙解释一下吗?

这是我正在使用的XML(缩写为易于阅读):

<reportPages>
   <page name="Page1">
    <pageBody>
      <contents>
        <textItem>...</textItem>
        <textItem>...</textItem>
        <block>...</block>
        <block>...</block>
        <conditionalBlocks>
          <conditionalBlockDefault>...</conditionalBlockDefault>
          <conditionalBlockCases refVariable="vView">
            <conditionalBlock refVariableValue="Item Rands">...</conditionalBlock>
            <conditionalBlock refVariableValue="Item Units">...</conditionalBlock>
          </conditionalBlockCases>
        </conditionalBlocks>
     </contents>
     <style>...</style>
   </pageBody>
   <pageHeader>...</pageHeader>
   <pageFooter>...</pageFooter>
   <style>...</style>
   <conditionalRender refVariable="vView">...</conditionalRender>
  </page>
  <page name="Page2">...</page>
</reportPages>

1 个答案:

答案 0 :(得分:0)

发生的事情是引用:

  

使用标记名称作为属性将只为您提供该名称的第一个标记。

如果要选择所有标记,则需要使用find_all方法,因为find_all会扫描整个文档以查找结果。

如果find_all找不到任何内容,则会返回一个空列表。

我建议您阅读BeautifulSoup documentation了解更多详情。