2014-01-17 82 views
1

我試圖去加載到一個BS對象的xml文件中的特定標籤,但是當我得到一個特定的標籤時,BS將進入第一個孩子,當我嘗試訪問使用方括號'[]'的孩子。BeautifulSoup直接進入第一個孩子的孩子,而不是索引直接的孩子

例如,考慮下面的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> 
+0

這是因爲BeautifulSoup屬性訪問*與* XPath不相同。如果使用'Tag.some_attribute',總是返回* first *匹配的子標籤。 –

+0

BeautifulSoup更適合HTML;如果你想遍歷XML,使用'lxml'(或簡單的'xml.etree.elementtree'。 –

+0

@MartijnPieters,那麼我可以使用find或findall作爲那個特定的標籤嗎? – pythonian29033

回答

0

會發生什麼事,並引用:

使用標籤名,屬性會給你只有這個名字的第一個標籤。

如果你要選擇你需要使用find_all方法,因爲find_all掃描整個文件查找結果所有標籤。如果find_all找不到任何東西,它會返回一個空列表。

我建議您閱讀BeautifulSoup documentation瞭解更多詳情。