2012-06-02 92 views
1

我需要遍歷美麗的湯元素並得到屬性值: 對於一個XML文檔:如何遍歷美麗的湯元素獲得屬性值

<?xml version="1.0" encoding="UTF-8"?> 

<Document> 
    <Page x1="71" y1="120" x2="527" y2="765" type="page" chunkCount="25" 
     pageNumber="1" wordCount="172"> 
     <Chunk x1="206" y1="120" x2="388" y2="144" type="unclassified"> 
      <Word x1="206" y1="120" x2="214" y2="144" font="Times-Roman" style="font-size:22pt">K</Word> 
      <Word x1="226" y1="120" x2="234" y2="144" font="Times-Roman" style="font-size:22pt">O</Word> 
     </Chunk> 
    </Page> 
</Document> 

我想獲得的X1值「單詞」元素(206,226)。 幫助很多appriciated!

編輯: 我曾嘗試:

for i in soup.page.chunk: 
    i.word['x1'] 

返回一個錯誤:

File "C:\Python26\lib\site-packages\BeautifulSoup.py", line 473, in __getattr__ 
    raise AttributeError, "'%s' object has no attribute '%s'" % (self.__class__.__name__, attr) 
AttributeError: 'NavigableString' object has no attribute 'word' 

同時:

soup.page.chunk.word['x1'] 

工作正常...和:

for i in soup.page.chunk: 
    i.findNext(text=True) 

獲取文本形式的元素。

+0

編輯的問題與我的失敗 – root

回答

2

這似乎雖然沒有那優雅的工作:

for word in soup.page.chunk.find_all('word'): 
    print word['x1'] 

嵌套find_all的也應該工作。但可能最好使用類似於css的選擇(從lxml或從lxml)。

基本上,如果我沒有弄錯soup.page.chunk是一個節點,湯標籤。所以如果你想迭代,你必須調用find_all。

upd。不同的方法可能是find_all('word'),然後在條件過濾像word.parent.name == 'smth'

[!]在BeautifulSoup3(不BS4),它應該是findAll而不是find_all

+0

非常感謝。我不確定這是否在BS4中發生了變化,但在BS3中它應該是「findAll」。 – root

+1

@root:的確如此。 :) bs4提供了一些古怪的駱駝和蛇的版本。 – gorlum0