学爬虫的第 n 天

学习的内容:(lxml库)etree

下面以 2016 年腾讯招聘(社会招聘)页面的部分 html 为例(图片高糊勿介意)

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 首先导入 lxml

from lxml import etree

parser = etree.HTMLParser(encoding='utf-8')  # 使用 html的解析器来解析 HTML文档
html = etree.parse("old_tencent.html", parser=parser) # old_tencent.html是上面的内容哦

0x01 获取所有 tr 标签

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 标签

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

0x03 获取所有 class 等于 eventr 标签

trs = html.xpath("//tr[@class='even']")
for tr in trs:
    print(etree.tostring(tr, encoding='utf-8').decode('utf-8'))
0x03 返回结果

0x04 获取所有 a 标签的 href 属性

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)最新的腾讯招聘(社会招聘)页面的部分 html 为例并结尾吧 ~

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)

彩蛋一

代码中的 framework 框架(包含PCG、IEG等)的意思如下:

【2018年9月29日】腾讯宣布调整 内部构架,新成立云与智慧产业事业群(CSIG)、平台与内容事业群(PCG),而原有的微信事业群(WXG)、互动娱乐事业群(IEG)、技术工程事业群(TEG),企业发展事业群(CDG)继续保留。此外,腾讯将整合社交与效果广告部(SPA)与原网络媒体事业群(OMG)广告线,成立新的广告营销服务线(AMS)

彩蛋二

招聘信息中出现的 天美宝可梦高级测试开发工程师(深圳),我特地去搜索了一下这个游戏

天美工作室公布《宝可梦:大集结》被玩家疯狂吐槽

这不是重点,重点是我看到下面的人评论,我真是一时不知如何吐槽,甚至笑出声来 😂

神评内容

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

友情链接更多精彩内容