python之xml數據解析

由於項目需求須要查詢一些網站的ALEXA排名,百度後獲得的方法是,訪問http://data.alexa.com/data?cli=10&dat=snbamz&url=%YOURURL%,能夠獲得以下的XML格式的數據:python

<!--
 Need more Alexa data?  Find our APIs here: https://aws.amazon.com/alexa/ 
-->
<ALEXA VER="0.9" URL="sina.com/" HOME="0" AID="=" IDN="sina.com/">
<RLS PREFIX="http://" more="0">
<RL HREF="www.china.com/" TITLE="中華網科技公司"/>
<RL HREF="www.alibaba.com/" TITLE="Alibaba.com"/>
<RL HREF="www.yahoo.com/" TITLE="Yahoo!"/>
<RL HREF="www.yahoo.com.cn/" TITLE="雅虎中國 (yahoo.com.cn)"/>
<RL HREF="www.tyfo.com/" TITLE="天虎網"/>
<RL HREF="www.tom.com/" TITLE="Tom"/>
<RL HREF="www.sohu.com/" TITLE="搜狐首頁"/>
<RL HREF="www.singtao.com/" TITLE="星島日報"/>
<RL HREF="www.sina.com.tw/" TITLE="臺灣新浪網"/>
<RL HREF="www.sina.com.cn/" TITLE="新浪首頁"/>
</RLS>
<SD TITLE="A" FLAGS="" HOST="sina.com">
<TITLE TEXT="sina1.com"/>
<OWNER NAME="Sina.Com Technology(china)co., Ltd"/>
</SD>
<SD>
<POPULARITY URL="sina.com/" TEXT="19624" SOURCE="panel"/>
<REACH RANK="16868"/>
<RANK DELTA="+6598"/>
<COUNTRY CODE="US" NAME="United States" RANK="5005"/>
</SD>
</ALEXA>

其中,<POPULARITY >標籤的TEXT屬性值正是網站的ALEXA排名。因而就須要在項目中利用xml解析工具提取TEXT屬性值。函數

方法以下:工具

1.SAX (simple API for XML )

Python 標準庫包含 SAX 解析器,SAX 用事件驅動模型,經過在解析XML的過程當中觸發一個個的事件並調用用戶定義的回調函數來處理XML文件。性能

2.DOM(Document Object Model)

將 XML 數據在內存中解析成一個樹,經過對樹的操做來操做XML。網站

3.ElementTree(元素樹)

ElementTree就像一個輕量級的DOM,具備方便友好的API。代碼可用性好,速度快,消耗內存少。url

注:因DOM須要將XML數據映射到內存中的樹,一是比較慢,二是比較耗內存,而SAX流式讀取XML文件,比較快,佔用內存少,但須要用戶實現回調函數(handler)。spa

由於性能緣由選用第三種方法,操做流程以下:code

1.導入ElementTreexml

try:
    import xml.etree.cElementTree as ET
except ImportError:
    import xml.etree.ElementTree as ET

2.請求網址獲取數據對象

        try:
            data = requests.get(url)
            if data.status_code == 200:
                # Response格式中提取xml內容
                xml_data = data.content
            else:
                raise Exception('request alexa rank failed!')

3.從xml數據變量構造ElementTree對象

root = ET.fromstring(xml_data)

4.利用xpath找到元素並提取屬性

pop = root.findall('.SD/POPULARITY')
   if pop:
      print(pop[0].get('TEXT', None))

5.打完收工。

相關文章
相關標籤/搜索