因为项目需求需要查询一些网站的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.打完收工。