上接(1)、(2)
之前已经做到了可以查询这段时间里的特价机票消息,鉴于自己是个地理盲,有时候又想图个便宜出去溜达溜达,但目的地可能没有直接的航班,可能需要换成一下,于是有了现在的这个小功能。
现在补充上之前留下的那个功能:查询在中国的本省附近几个城市的特价机票信息。
一、获取省市信息
之前我的想法是从某一个网站进行在线查询,然后根据返回的结果获取,结果并没有合适的网站,最多也是需要在不停的在不同的网站之间转跳才可以查询得到。
于是就在网上搜关于省市信息的xml信息,最后找到了。
下面是的作用是输入城市信息,会反向输出对应的省份信息,后面主要根据这个进行查询。xml格式如下,可见这个层次区分还是很明显的:
<?xml version="1.0" encoding="UTF-8"?>
<root name="中国">
<province name="北京市">
<city name="北京市" index="1">
<area name="东城区" index="1" />
<area name="西城区" index="2" />
<area name="崇文区" index="3" />
<area name="宣武区" index="4" />
<area name="朝阳区" index="5" />
<area name="丰台区" index="6" />
<area name="石景山区" index="7" />
<area name="海淀区" index="8" />
<area name="门头沟区" index="9" />
<area name="房山区" index="10" />
<area name="通州区" index="11" />
<area name="顺义区" index="12" />
<area name="昌平区" index="13" />
<area name="大兴区" index="14" />
<area name="平谷区" index="15" />
<area name="怀柔区" index="16" />
<area name="密云县" index="17" />
<area name="延庆县" index="18" />
</city>
</province>
...
</root>
下面函数,dig 的主要作用是找出这个县市的上级,直到省份,方便以后需要进行县级查询时的扩展。
# 获取目的地的省份
def get_Target(cityname):
tree = ET.ElementTree(file='province_city.xml')
root = tree.getroot()
name = dig(root, cityname)
for item in name:
for province in name[item]:
return province
def dig(tree, cityname):
findedname = {}
key = tree.attrib['name']
value = []
for elem in tree:
if cityname in elem.attrib['name']:
value.append(elem.attrib['name'])
findedname[key] = value
currentname = dig(elem, cityname)
if currentname != {}:
findedname[key] = currentname
return findedname
二、航班信息规整
在第二篇中已经获取了航班信息,现在为了方便出行,我现在对航班进行按照省份的排序,将同一个省的特价航班放在一起,方便进行比较。
# 将特价航班按照省份归类
# 输入所有特价航班,将查询出来一样的省份放到同一个字典里
def flights_sort(flights):
names = {}
for f in flights:
value = []
province = get_Target(f['arrName'])
if not names.has_key(province):
value.append(f)
names[province] = value
else:
value = names[province]
value.append(f)
names[province] = value
return names
看了之后,我感觉还是很直观的。
三、查询后的航班信息输出
# 输出目的地及其附近的航班信息
def printTargetInfo(sorted_flights, targetName):
print
print '*****************targetInfo*****************'
currentName = set(targetName)
for province in sorted_flights:
for targetProvince in currentName:
if targetProvince == province:
print_trip(sorted_flights[province], province)
# 输出目的地航班信息
def print_trip(flight, province):
print '===============Province:%s===============' % province
for f in flight:
source = '从:%s-' % f['depName']
dest = '到:%s\t' % f['arrName']
price = '\t价格:%s%s(折扣:%s)\t' % ((f['price']), f['priceDesc'], f['discount'])
depart_date = '\t日期:%s' % f['depDate']
print source + dest + price + depart_date
最终的查询效果如下图:
完整代码见:我的Github地址
感慨一句:偷懒是生产力的来源啊!