学习的内容:(lxml库)etree
下面以 2016 年腾讯招聘(社会招聘)页面的部分 为例(图片高糊勿介意)

2016 年腾讯招聘(社会招聘)页面
<table class="tablelist1" cellpadding="0" cellspacing="0">
<tbody>
<tr class="h">
<td class="l" width="374">职位名称</td>
<td>职位类别</td>
<td>人数</td>
<td>地点</td>
<td>发布时间</td>
</tr>
<tr class="even">
<td class="l square">
<a target="_blank" href="position_detail.php?id=33824&keywords=python&tid=87&lid=2218">
22989-金融云区块链高级研发工程师(深圳)
</a>
</td>>
<td>技术类</td>
<td>1</td>
<td>深圳</td>
<td>2017-11-25</td>
</tr>
<tr class="odd">
<td class="l square">
<a target="_blank" href="position_detail.php?id=29938&keywords=python&tid=87&lid=2218">
22989-金融云高级后台开发
</a>
</td>>
<td>技术类</td>
<td>2</td>
<td>深圳</td>
<td>2017-11-25</td>
</tr>
<tr class="even">
<td class="l square">
<a target="_blank" href="position_detail.php?id=31236&keywords=python&tid=87&lid=2218">
SNG16-腾讯音乐运营开发工程师(深圳)
</a>
</td>>
<td>技术类</td>
<td>2</td>
<td>深圳</td>
<td>2017-11-25</td>
</tr>
<tr class="odd">
<td class="l square">
<a target="_blank" href="position detail.php?id=31235&keywords=python&tid=87&lid=2218">
SNG16-腾讯音乐业务运维工程师(深圳)
</a>
</td>>
<td>技术类</td>
<td>1</td>
<td>深圳</td>
<td>2017-11-25</td>
</tr>
</tbody>
</table>
0x00 首先导入 库
from lxml import etree
parser = etree.HTMLParser(encoding='utf-8') # 使用 html的解析器来解析 HTML文档
html = etree.parse("old_tencent.html", parser=parser) # old_tencent.html是上面的内容哦
0x01 获取所有 标签
trs = html.xpath("//tr") # 类型为 lxml.etree._Element
for tr in trs:
print(etree.tostring(tr, encoding='utf-8').decode('utf-8')) # 按字符串序列化 HTML文档

0x01 返回结果
0x02 获取第 2 个 标签
tr = html.xpath("//tr[2]")[0]
# 上面的 [2]代表第二个元素
# 上面的 [0]代表返回 list的第一个 lxml.etree._Element值(实际上也只有一个值)
print(etree.tostring(tr, encoding='utf-8').decode('utf-8'))

0x02 返回结果
0x03 获取所有 等于
的
标签
trs = html.xpath("//tr[@class='even']")
for tr in trs:
print(etree.tostring(tr, encoding='utf-8').decode('utf-8'))

0x03 返回结果
0x04 获取所有 标签的
属性
aList = html.xpath("//a/@href")
# //a/@href 返回的是值
# //a[@href] 返回的是标签
for a in aList:
print("http://hr.tencent.com/"+a) # 事实上返回的链接都访问不了,因为这些网站都更新了

0x04 返回结果
0x05 获取所有职位信息(纯文本)
trs = html.xpath("//tr[position()>1]") # 从第二个 tr标签开始获取
positions = []
for tr in trs:
href = tr.xpath(".//a/@href")[0]
# .//a/@href 获取当前 a标签下 href属性的值
# //a/@href 获取整个 html下 href属性的值
fullurl = 'http://hr.tencent.com/' + href
title = tr.xpath("./td[1]//text()")[1] # 这里选择 [0]或 [1]和 html文档的格式有关
# //text() 表示在此标签下面所有的文本
category = tr.xpath("./td[2]/text()")[0]
# /text() 表示在此标签的文本
nums = tr.xpath("./td[3]/text()")[0]
address = tr.xpath("./td[4]/text()")[0]
pubtime = tr.xpath("./td[5]/text()")[0]
position = {
'url': fullurl,
'title': title,
'category': category,
'nums': nums,
'address': address,
'pubtime': pubtime
}
positions.append(position)
print(positions)
# 鄙人不才,对于 title的多余内容我不知如何处理

0x05 返回结果
最后再以今年(2021)最新的腾讯招聘(社会招聘)页面的部分 为例并结尾吧 ~

2021 年腾讯招聘(社会招聘)页面

下载到本地的 html 部分展示
获取 腾讯社招 信息的完整代码
from lxml import etree
parser = etree.HTMLParser(encoding='utf-8')
html = etree.parse("tencent.html", parser=parser) # tencent.html是上面的内容哦
num = 0
divs = html.xpath("//div[@class='recruit-list']")
positions = [] # 全部信息存储在列表中
for div in divs:
job = html.xpath("//h4/text()")[num] # 随着循环次数变化
num += 1
framework = div.xpath(".//span/text()")[0] # 架构
address = div.xpath(".//span/text()")[1] # 地址
category = div.xpath(".//span/text()")[2] # 目录
date = div.xpath(".//span/text()")[3] # 发布日期
info = div.xpath("./a/p[@class='recruit-text']/text()")[0] # 招聘信息
url = div.xpath(".//div[@class='qr-code']/@id")[0] # 链接地址
fullurl = 'https://careers.tencent.com/jobdesc.html?postId=' + url # 完整链接
position = {
'url': fullurl,
'job': job,
'framework': framework,
'address': address,
'category': category,
'date': date,
'info': info
}
positions.append(position)
print(positions)
# 鄙人不才,对于 info的多余内容我不知如何处理

最终结果
总结性知识点:XPath 语法(W3school)
彩蛋一
代码中的 框架(包含PCG、IEG等)的意思如下:
【2018年9月29日】腾讯宣布调整 内部构架,新成立云与智慧产业事业群(CSIG)、平台与内容事业群(PCG),而原有的微信事业群(WXG)、互动娱乐事业群(IEG)、技术工程事业群(TEG),企业发展事业群(CDG)继续保留。此外,腾讯将整合社交与效果广告部(SPA)与原网络媒体事业群(OMG)广告线,成立新的广告营销服务线(AMS)
彩蛋二
招聘信息中出现的 天美宝可梦高级测试开发工程师(深圳),我特地去搜索了一下这个游戏

天美工作室公布《宝可梦:大集结》被玩家疯狂吐槽
这不是重点,重点是我看到下面的人评论,我真是一时不知如何吐槽,甚至笑出声来 😂

神评内容
我就不发表自己的观点了,各位懂得都懂哈哈哈