我試圖去加載到一個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>
這是因爲BeautifulSoup屬性訪問*與* XPath不相同。如果使用'Tag.some_attribute',總是返回* first *匹配的子標籤。 –
BeautifulSoup更適合HTML;如果你想遍歷XML,使用'lxml'(或簡單的'xml.etree.elementtree'。 –
@MartijnPieters,那麼我可以使用find或findall作爲那個特定的標籤嗎? – pythonian29033