用python提取html页面内容的一次实践

本文介绍使用pyQuery解析来自智联招聘、中华英才网、成都人才网、58同城及51job的应聘者信息邮件。针对不同网站的HTML结构,实现自动化提取姓名、性别、电话和邮箱等功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

用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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值