這兩天學習如何使用微軟的一個API,用python寫了接口代碼使用HTTP方法測試,HTTP的API的最后返回是一個XML文件,翻了翻,看見python的xml的ElementTree這套接口的API看起來比較對胃口,於是使用了一下ElementTree進行解析
但死活用find,和findall兩個函數接口服務得到希望的tag,百思不得其借,
Python的docamention上面對這兩個函數,解釋非常簡單。
- find ( match )
-
Finds the first subelement matching match. match may be a tag name or path. Returns an element instance or None.
回家找了一下《Python Essential Reference》國內翻譯《Python參考手冊》,手冊的解釋太簡單,其參數match含義其實挺復雜的。
其有tag,* .//tag,tag1/tag2,*/tag等不同的用法,文檔上根本沒有說明白。不知道是不是因為ElementTree 是一個外家的孩子,在本家不受待見還是因為是effbot自己提交的文檔,文檔寫的馬虎了。
有興趣的去 http://effbot.org/zone/element.htm 翻翻,比docamention 上面講的清楚明白一些。
廢話不多說,用代碼解釋這兩個函數。
xml_str="""<a><b>1</b><b>2</b><c><d><b>3</b><b>4</b></d><e><b>5</b><b>6</b></e></c></a>"""tag = xml.etree.ElementTree.fromstring(xml_str)print "find a-----------------------------------------------------"find_tag = tag.findall("a") #自己是搜索不到print find_tag
find_tag = tag.findall("*") #找打text為1,2的b和Cprint find_tag
print "find b-----------------------------------------------------"find_tag = tag.findall("b") #找到 text 為 1,2的bprint find_tag
for item in find_tag:print item,item.text
find_tag = tag.findall(".//b") #找到 text 為 1,2,3,4,5,6 的bprint find_tag
for item in find_tag:print item,item.text
print "find d-----------------------------------------------------"find_tag = tag.findall("d") #不是A的子節點,這樣搜索不到。print find_tag
find_tag = tag.findall("c/d") #到達d的路徑,path不包括當前節點print find_tag
find_tag = tag.findall(".//d") #使用.//前綴,從當前節點尋找所有的下方節點print find_tag
print "find path . *-----------------------------------------------------"tag_c = tag.find(".//c") #從C開始找find_tag = tag_c.findall(".//b") ##找C下面所有層次找b,找到 text 為 3,4,5,6 的bprint find_tag
for item in find_tag:print item,item.text
find_tag = tag_c.findall("*/b") #找到C,D下面一層所有tag為b的數據 ,也是找到 text 為 3,4,5,6 的bprint find_tag
for item in find_tag:print item,item.text
print "xml namespace -----------------------------------------------------"xml_str="""<a xmlns="http://www.w3.org/TR/html4" >
<b>1</b></a>"""tag = xml.etree.ElementTree.fromstring(xml_str)find_tag = tag.findall("*") #如果有xml命名空間,那么所有所有的tag都有名字空間的uri,如上這個tag字符串是 {http://www.w3.org/TR/html4}b 而不是bprint find_tag
倒霉的是,這幾個暗礁怎么都讓我碰上了。
【可以在標明作者和出處的情況下的完整轉載,不得用於盈利和商業用途,否則每字1元,每圖100,不降價,對百度文庫,360doc加價一倍】