python之xml數據解析


因為項目需求需要查詢一些網站的ALEXA排名,百度后得到的方法是,訪問http://data.alexa.com/data?cli=10&dat=snbamz&url=%YOURURL%,可以得到如下的XML格式的數據:

<!--
 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。代碼可用性好,速度快,消耗內存少。

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

因為性能原因選用第三種方法,操作流程如下:

1.導入ElementTree

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.打完收工。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM