Python-数据解析-职位信息-下

2019-07-18 15:18:17 浏览数 (3)

上一节代码如下

代码语言:javascript复制
import re
import urllib.request

class Spider(object):
  def __init__(self):
    # 起始页位置
    self.begin_page = int(input("请输入起始页:"))
    # 终止页位置
    self.end_page = int(input("请输入终止页:"))
    # 基本 URL
    self.base_url = "http://hr.tencent.com/"
  
  def load_page(url):
    headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36"}
    for page in range(self.begin_page, self.end_page   1):
      url = self.base_url   "position.php?&start="   str((page -1)*10   "#a")
      request = urllib.request.Request(url, headers=headers)
      # 获取每页 HTML 源代码字符串
      response = urllib.request.urlopen(request)
      html = response.read().decode("utf-8")
      return html

一、使用 lxml 库解析网页数据

代码语言:javascript复制
<tr class="even">
          <td class="l square"><a target="_blank" href="position_detail.php?id=49104&amp;keywords=&amp;tid=0&amp;lid=0">CDG-FiT-HRBP(深圳)</a></td>
          <td>职能类</td>
          <td>1</td>
          <td>深圳</td>
          <td>2019-04-03</td>
</tr>

① 查找所有的职位详情链接。

详情链接位于 <a> 中,对应着该标签的 href 属性的值。

代码语言:javascript复制
//td[@class="l square"]/a/@href

② 查找所有的职位名称。

表示职位名称的文本对应着标签 <a> 的文本。

代码语言:javascript复制
//td[@class="l square"]/a/text()

③ 查找其它元素。

代码语言:javascript复制
//tr[@class="even"]/td[2] | //tr[@class="odd"]/td[2]

查找招聘人数

代码语言:javascript复制
//tr[@class="even"]/td[3] | //tr[@class="odd"]/td[3]

查找工作地点

代码语言:javascript复制
//tr[@class="even"]/td[4] | //tr[@class="odd"]/td[4]

查找发布时间

代码语言:javascript复制
//tr[@class="even"]/td[5] | //tr[@class="odd"]/td[5]

在 parse_page() 方法中实现

代码语言:javascript复制
from lxml import etree

def parse_page(self, html):
  # 从字符串中解析 HTML 文档或片段,返回根节点
  root = etree.HTML(html)
  
  # 查找所有的详情链接
  links = root.xpath('//td[@class="l square"]/a/@href')
  
  # 查找所有的职位名称
  names = root.xpath('//td[@class="l square"]/a/text()')
  
  # 查找所有的职位类别
  categorys = root.xpath('//tr[@class="even"]/td[2] | //tr[@class="odd"]/td[2]')
  
  # 查找所有的招聘人数
  counts = root.xpath('//tr[@class="even"]/td[3] | //tr[@class="odd"]/td[3]')
  
  # 查找所有的工作地点
  locations = root.xpath('//tr[@class="even"]/td[4] | //tr[@class="odd"]/td[4]')
  
  # 查找所有的发布时间
  publish_times = root.xpath('//tr[@class="even"]/td[5] | //tr[@class="odd"]/td[5]')
  
  # 定义空列表,保存元素的信息
  items = []
  for i in range(0, len(names)):
    item = {}
    item['职位名称'] = names[i]
    item['详情链接'] = self.base_url   links[i]
    item['职位类别'] = categorys[i].text
    item['招聘人数'] = counts[i].text
    item['工作地点'] = locations[i].text
    item['发布时间'] = publish_times[i].text
    items.append(item)

1 人点赞