Python网络服务
由于浏览器中查看drchuck的twitter朋友列表,它看上有点乱七八糟。为了能够看到真正Twitter返回的XML数据,你可以查看网络页面的源代码。
我们可以通过Python的urllib库获得这个XML数据。
importurllib
TWITTER_URL='http://api.twitter.com/l/statuses/friends/ACCT.xml'
whileTrue:
print''
acct=raw_input('EnterTwitterAccount:')
if(len(acct)<1):break
url=TWITTER_URL.replace('ACCT',acct)
print'Retrieving',url
document=urllib.urlopen(url).read()
printdocument[:250]
程序命令提示框中,输入Twitter账号,程序就会获取这个Twiiter账号中所有朋友和其状态信息,并且会显示返回数据结果中前250字符。
pythontwitter1.py
EnterTwitterAccount:drchuck
Retrievinghttp://api.twitter.com/l/statuses/friends/drchuck.xml
<?xmlversion="1.0"encoding="UTF-8"?>
<userstype="array">
<user>
<id>115636613</id>
<name>SteveCoppin</name>
<screen_name>steve_coppin</screen_name>
<location>Kent,UK</location>
<description>Softwaredeveloping,bestpracticing,agilee
EnterTwitterAccount:
在这个案例中,我们已读取XML数据,就像读取一个HTML网络页面一样。如果我们想从XML中获取数据,我们可以使用Python的string方法,但它会变得非常复杂,就像我们已经开始深挖XML细节一样。
我们获得XML数据,大致看看如下所示:
<?xmlversion="1.0"encoding="UTF-8"?>
<userstype="array">
<user>
<id>115636613</id>
<name>SteveCoppin</name>
<screen_name>steve_coppin</screen_name>
<location>Kent,UK</location>
<status>
<id>10174607039</id>
<source>web</source>
</status>
</user>
<user>
<id>17428929</id>
<name>davidkocher</name>
<screen_name>davidkocher</screen_name>
<location>Bern</location>
<status>
<id>10306231257</id>
<text>@MikeGraceIfpossiblepleasepostadetailedbugreport</text>
</status>
</user>
...
最顶端标签是users,它有很多个user标签。每个user标签都有个status标签。
13.6处理API数据
当我们从API中获取一个标准XML数据,我们通常会使用XML解析器(例如:EelementTree)来解析XML数据,从而获得一些有用的信息。在Python中,我们使用ElementTree来解析XML数据。
下面示例中,我们将通过TwiiterAPI来获取朋友和其状态数据,然后进行XML解析,最后输出前四个朋友和其状态。
importurllib
importxml.etree.ElementTreeasET
TWITTER_URL='http://api.twitter.com/l/statuses/friends/ACCT.xml'
whileTrue:
print''
acct=raw_input('EnterTwitterAccount:')
if(len(acct)<1):break
url=TWITTER_URL.replace('ACCT',acct)
print'Retrieving',url
document=urllib.urlopen(url).read()
print'Retrieved',len(document),'characters.'
tree=ET.fromstring(document)
count=0
foruserintree.findall('user'):
count=count+1
ifcount>4:break
printuser.find('screen_name').text
status=user.find('status')
ifstatus:
txt=status.find('text').text
print'',txt[:50]
我们使用findall方法获取一个列表的用户节点,然后对列表中的用户信息进行遍历。对每一个每用户节点,我们会输出他们的screen_name和status。如果有status节点,就打印出前50个字符的status文本,如果没有,则不输出。
这个方法比较简单明了,我们使用findall方法可以获得一个列表节点或者单个节点。如果一个节点带有很多字节点的元素,那么我们会进一步获取这个节点的信息,直到我们找到我们想要的数据。
示例代码如下:
pythontwitter2.py
EnterTwitterAccount:drchuck
Retrievinghttp://api.twitter.com/l/statuses/friends/drchuck.xml
Retrieved193310characters.
steve_coppin
Lookingforwardtosome"ohnothemarketsclosed,
davidkocher
@MikeGraceIfpossiblepleasepostadetailedbug
hrheingold
Fromtoday'sColumbiaJournalismReview,oncrapd
huge_idea
@drchuck#cnx2010missesyou,too.Thanksforco
EnterTwitterAccount:hrheingold
Retrievinghttp://api.twitter.com/l/statuses/friends/hrheingold.xml
Retrieved208081characters.
carr2n
RT@tysone:Saturday'sproclaimationby@carr2npr
tiffanyshlain
RT@ScottKirsner:Turningsmartphonesintoatool
soniasimone
@ACCompanyCFunny,smart,cute,andalsonice!He
JenStone7617
Watching"ChangingTheEquation:HighTechAnswers
EnterTwitterAccount:
使用ElementTree比使用Python的string方法,对XML解析和获取字段更加简单。
13.7词汇表
API:
应用程序接口-两个应用程序组件间的一种交互模式。
ElementTree:
一个Python自带库,通常用于解析XML数据
XML:
可扩展标记语言-一种结构式数据标签格式
REST:
表述性状态传递-提供一个基于HTTP协议应用程序的数据访问的网络服务。
SOA:
面向服务架构-一个应用程序是通过网络连接的组件。
13.8练习
练习1修改上文中Twitter示例,命名为twitter2.py。这个程序能够读取给定Twitter用户账号的朋友数据,并且能够打印出每个朋友的个人信息。每个朋友信息格式为:第一行为朋友的twitter用户名,第二行为朋友的地址信息,第三行为朋友最新一条状态小心。以下是一个完整程序输出。
EnterTwitterAccount:drchuck
Retrievinghttp://api.twitter.com/l/statuses/friends/drchuck.xml
Retrieved194533characters.
steve_coppin
Kent,UK
Lookingforwardtosome"ohnothemarketsclosed,
davidkocher
Bern
@MikeGraceIfpossiblepleasepostadetailedbug
hrheingold
SanFranciscoBayArea
RT@barrywellman:LovelyAmBerhSciInternet&Comm
huge_idea
Boston,MA
@drchuck#cnx2010missesyou,too.Thanksforco
Python培训、Python培训班、Python培训机构,就选光环大数据!
还不够过瘾?想学习更多?点击 http://hadoop.aura.cn/python/ 进行Python学习!
大数据培训、人工智能培训、Python培训、大数据培训机构、大数据培训班、数据分析培训、大数据可视化培训,就选光环大数据!光环大数据,聘请专业的大数据领域知名讲师,确保教学的整体质量与教学水准。讲师团及时掌握时代潮流技术,将前沿技能融入教学中,确保学生所学知识顺应时代所需。通过深入浅出、通俗易懂的教学方式,指导学生更快的掌握技能知识,成就上万个高薪就业学子。 更多问题咨询,欢迎点击------>>>>在线客服!