用Python+BeautifulSoup查快递状态

俺在淘宝代购了双鞋,从美国邮过来的,时间比较长。每天要去快递网站比较麻烦,一直有想用python模拟浏览器的想法,正好拿这个开刀。由于请求的网址中包括了快递单号,基本思路就出来了:只需要把带单号的地址发送请求过去,返回的页面中就有状态信息了;然后对返回的HTML页面进行解析,提取自己想要的信息就搞定了。

我用了urllib2来发HTTP请求(其它的httplib之类的都行)。解析网页这块找了好几个,比如HTMLParser.HTMLParser,sgmllib.SGMLParser。最后还是选择了BeautifulSoup。“靓汤”真的很“好喝”,哈哈。

使用Beautiful Soup,先下载最新的3.2.0(python 2.x专用),解压后进入BeautifulSoup-3.2.0目录执行如下命令即可以喝“靓汤”啦~

$python setup.py install

上代码,解释看代码里面的注释:

# coding=utf-8
# filename: CheckXLOBOExpressStatus.py
from __future__ import unicode_literals
from BeautifulSoup import BeautifulSoup
import urllib2
import re
url=r'http://www.xlobo.com/Public/PubB.aspx?code=DB111111111US' # DBxxxUS is the express number to be queried
req=urllib2.Request(url)
resp=urllib2.urlopen(req)
page=resp.read()
from os import linesep
page=page.strip(linesep)
soup=BeautifulSoup(page)
result=[]
temp=[]
# using two 'for' block to make all info in the same line in one list
for block in soup.findAll('div', {'class' : 'ff_row'}):
    for tag in block.findAll('span',{'class': re.compile(r'ff_\d{3} in_bk')}):
        temp.append(tag.text)
    result.append(temp)
    temp=[]

from sys import getfilesystemencoding
for i,v in enumerate(result):
    if i ==0:
        print '{0[0]:<s}\t\t\t{0[1]:<s}\t\t\t\t{0[2]:<s}'.format(v).encode(getfilesystemencoding())
    else:
        print '{0[0]:<s}\t{0[1]:<s}\t{0[2]:<s}\t{0[3]:s}'.format(v).encode(getfilesystemencoding())