用python提取html页面内容的一次实践。
pyQuery采用与jquery相似的语法解析html页面内容。
本例对招聘网站发送的应聘者信息进行解析。这些应聘者信息都是以html的方式发送到接收者邮箱,通过收信软件保存为html文件。
本文主要解析招聘网站是
1.智联招聘
2.中华英才网
3.成都人才网
4.58同城
5.51job
其中智联招聘的解析最为麻烦,因为不能直接通过解析html页面得到电话,邮件地址,而是要动态地访问网址才能获取相应的信息。所以专门写了一个函数来获取url对应的页面内容
#取得网页内容
def getHtml(self,url):
#必须要设定user-agent,否则会被服务器拒绝,从而产生raise BadStatusLine
headers = {'User-Agent':'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6'}
req = urllib2.Request(url,headers=headers)
page = urllib2.urlopen(req)
html = page.read()
#print type(html)
html = html.decode('utf-8')
return html
其它几家的解析就相对简单,不需要动态访问url再获取内容。
完整的python代码
# -*- coding:utf-8 -*-
# 用pyQuery解析应聘邮件页面
import sys
import codecs
import json
import urllib2
import time
from dateutil import parser
from pyquery import PyQuery
#页面解析类
class MailParser:
#解析解析智联招聘的邮件页面
def zhiLianZhaoPing(self,htmlString):
#在从邮件中取回内容存为html文件时,字符编码设置为了utf8
#不能直接让pyquery读取,否则中文会被当做unicode处理而出错
pq = PyQuery(htmlString)
tables = pq('table table table table')
for table in tables:
tds = pq(table).find('td')
for td in tds:
tdStyle = pq(td).attr('style')
#从目前的实践来看,tdStyle会出现 str,unicode,nonetype三种情况
#str对应纯英文,unicode对应包含中文的情况,nonetype就是没有style属性
# print type(tdStyle)
# if type(tdStyle)==type('str'):
# print (tdStyle)
if tdStyle==u"font-size:22px;color:#333333;font-family:'微软雅黑';padding-left:12px;line-height:50px":
pName = pq(td).html()
#print pName
pSex = pq(td).parent().next().children().children().eq(0).html()
#print pSex
#进入孩子对象中的超连接 ,找出与电话相关的key值
links = pq(table).find("a");
for link in links:
linkText = pq(link).html();
if(linkText == '我要联系TA'):
ajaxUrl = pq(link).attr('href')
#print ajaxUrl
tmpArray=ajaxUrl.split('param=');
ajaxKey = tmpArray[1];
#print ajaxKey
ajaxResult = self.zhiLianZhaoPing_dianHua(ajaxKey)
#print ajaxResult
pPhone= ajaxResult['phone']
pMail= ajaxResult['email']
return {'name':pName,'sex':pSex,'phone':pPhone,'email':pMail}
return {'name':'','sex':'','phone':'','email':''}
#解析智联招聘的电话,邮件等
def zhiLianZhaoPing_dianHua(self,ajaxKey):
ajaxUrl = 'https://ihr.zhaopin.com/resumemanage/emailim.do?s='+ajaxKey;
#print ajaxUrl
jsonStr = self.getHtml(ajaxUrl);
jsonData = json.loads(jsonStr)
if jsonData['message']==u'操作成功':
return jsonData['data']
else:
print jsonData['message']
return {'phone':'','email':''}
#解析中华英才网的邮件页面
def zhongHuaXinCai(self,htmlString):
pq = PyQuery(htmlString)
result={}
result['name']= ''
result['sex']= ''
result['phone']= ''
result['email']= ''
elements = pq('table').find("div")
for element in elements:
#姓名的字体在页面上很突出,可以做为定位条件
elementStyle = pq(element).attr('style')
if(elementStyle=="display: block;font-size: 22px;line-height:22px;padding:0;margin:5px 0; font-weight: normal;color: #282828;"):
#去掉姓名后面可能跟随的<img>
tmpStr = pq(element).html();
tmpPos = tmpStr.find('<img')
if(tmpPos>-1):
tmpStr = tmpStr[0:tmpPos]
#去除空格等
tmpStr =tmpStr.strip()
result['name']= tmpStr
#找出姓名的下一个节点,得到性别
tmpStr =pq(element).next().eq(0).html()
#去除空格等
tmpStr =tmpStr.strip()
result['sex'] = tmpStr
break
#找出定位手机号,邮箱的img节点
imgs = pq('table').find("img")
#print imsgs
for img in imgs:
imgSrc = pq(img).attr('src')
if(imgSrc=='http://st02.chrstatic.com/themes/bchinahr/img/resume-email/phone.png'):
result['phone']= pq(img).next().html();
result['email']= pq(img).next().next().children().eq(1).html()
break
return result
#解析成都人才网的邮件页面
def chengDuRenCai(self,htmlString):
pq = PyQuery(htmlString)
result={}
result['name']= ''
result['sex']= ''
result['phone']= ''
result['email']= ''
#提取姓名
tmpStr = pq('#Form1').find("#name").html()
#去除空格等
tmpStr =tmpStr.strip()
result['name']= tmpStr
#提取性别
tmpStr = pq('#jbxxUl').children().eq(0).html()
#去除空格等
tmpStr =tmpStr.strip()
result['sex']= tmpStr
#提取电话
tmpStr = pq('#contactUl').children().eq(0).html()
#print tmpStr
tmpStr = tmpStr.split(':')[1]
#去除空格等
tmpStr =tmpStr.strip()
result['phone']= tmpStr
#提取邮箱
tmpStr = pq('#contactUl').children().eq(0).next().html()
#print tmpStr
tmpStr = tmpStr.split(':')[1]
#去除空格等
tmpStr =tmpStr.strip()
result['email']= tmpStr
return result
#解析58同城的邮件页面
def mail58TongCheng(self,htmlString):
pq = PyQuery(htmlString)
result={}
result['name']= ''
result['sex']= ''
result['phone']= ''
result['email']= ''
#提取姓名
tmpStr=''
h3 = pq('div div div div div div').find("h3")
tmpStr = pq(h3).html()
#去除空格等
tmpStr =tmpStr.strip()
result['name']= tmpStr.split('<span')[0]
#print result['name']
#提取性别
tmpStr=''
tmpStr = pq(h3).children().eq(0).text()
#去除空格等
tmpStr =tmpStr.strip('(')
tmpStr =tmpStr.split(',')[0]
result['sex']= tmpStr
#print result['sex']
##提取电话,提取邮箱
tmpStr=''
labels = pq('div div div div div div div div div p').find("label")
for label in labels:
tip = pq(label).html()
if(tip[0:4]=='手机号码'):
tmpStr = pq(label).children().eq(0).text()
result['phone']= tmpStr
break
if(tip[0:4]=='电子邮箱'):
tmpStr = pq(label).children().eq(0).text()
result['email']= tmpStr
break
return result
#取得网页内容
def getHtml(self,url):
#必须要设定user-agent,否则会被服务器拒绝,从而产生raise BadStatusLine
headers = {'User-Agent':'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6'}
req = urllib2.Request(url,headers=headers)
page = urllib2.urlopen(req)
html = page.read()
#print type(html)
html = html.decode('utf-8')
return html