因為項目需求需要查詢一些網站的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.打完收工。