爬虫—lxml提取数据

Posted kannei

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了爬虫—lxml提取数据相关的知识,希望对你有一定的参考价值。

我们好久不见~

来更新博客啦!最近在学爬虫,scrapy学不下去了,有点难搞啊,学点简单的吧哈哈哈哈

好啦,开始今天的分享~

首先得安装lxml库,pip install lxml

我们使用lxml库对html这样的字符串进行解析,将它还原为一个HTML页面,换句话说,Python里面的lxml库只做了这样一件事:将html字符串进行解析,供Xpath语法进行数据提取。

使用lxml中的etree对html进行处理,将它还原成网页

 

这里我们也需要先了解一下Xpath的知识,也很简单,我们通过一个具体的例子来演示一下

text = \\
"""
<ul class="ullist" padding="1" spacing="1">
    <li>
        <div id="top">
            <span class="position" width="350">职位名称</span>
            <span>职位类别</span>
            <span>人数</span>
            <span>地点</span>
            <span>发布时间</span>
        </div>
        <div id="even">
            <span class="l square">
              <a target="_blank" href="position_detail.php?id=33824&amp;keywords=python&amp;tid=87&amp;lid=2218">python开发工程师</a>
            </span>
            <span>技术类</span>
            <span>2</span>
            <span>上海</span>
            <span>2018-10-23</span>
        </div>
        <div id="odd">
            <span class="l square">
              <a target="_blank" href="position_detail.php?id=29938&amp;keywords=python&amp;tid=87&amp;lid=2218">python后端</a>
            </span>
            <span>技术类</span>
            <span>2</span>
            <span>上海</span>
            <span>2018-10-23</span>
        </div>
        <div id="even">
            <span class="l square">
              <a target="_blank" href="position_detail.php?id=31236&amp;keywords=python&amp;tid=87&amp;lid=2218">高级Python开发工程师</a>
            </span>
            <span>技术类</span>
            <span>2</span>
            <span>上海</span>
            <span>2018-10-23</span>
        </div>
        <div id="odd">
            <span class="l square">
              <a target="_blank" href="position_detail.php?id=31235&amp;keywords=python&amp;tid=87&amp;lid=2218">python架构师</a>
            </span>
            <span>技术类</span>
            <span>1</span>
            <span>上海</span>
            <span>2018-10-23</span>
        </div>
        <div id="even">
            <span class="l square">
              <a target="_blank" href="position_detail.php?id=34531&amp;keywords=python&amp;tid=87&amp;lid=2218">Python数据开发工程师</a>
            </span>
            <span>技术类</span>
            <span>1</span>
            <span>上海</span>
            <span>2018-10-23</span>
        </div>
        <div id="odd">
            <span class="l square">
              <a target="_blank" href="position_detail.php?id=34532&amp;keywords=python&amp;tid=87&amp;lid=2218">高级图像算法研发工程师</a>
            </span>
            <span>技术类</span>
            <span>1</span>
            <span>上海</span>
            <span>2018-10-23</span>
        </div>
        <div id="even">
            <span class="l square">
              <a target="_blank" href="position_detail.php?id=31648&amp;keywords=python&amp;tid=87&amp;lid=2218">高级AI开发工程师</a>
            </span>
            <span>技术类</span>
            <span>4</span>
            <span>上海</span>
            <span>2018-10-23</span>
        </div>
        <div id="odd">
            <span class="l square">
              <a target="_blank" href="position_detail.php?id=32218&amp;keywords=python&amp;tid=87&amp;lid=2218">后台开发工程师</a>
            </span>
            <span>技术类</span>
            <span>1</span>
            <span>上海</span>
            <span>2018-10-23</span>
        </div>
        <div id="even">
            <span class="l square">
              <a target="_blank" href="position_detail.php?id=32217&amp;keywords=python&amp;tid=87&amp;lid=2218">Python开发(自动化运维方向)</a>
            </span>
            <span>技术类</span>
            <span>1</span>
            <span>上海</span>
            <span>2018-10-23</span>
        </div>
        <div id="odd">
            <span class="l square">
              <a target="_blank" href="position_detail.php?id=34511&amp;keywords=python&amp;tid=87&amp;lid=2218">Python数据挖掘讲师 </a>
            </span>
            <span>技术类</span>
            <span>1</span>
            <span>上海</span>
            <span>2018-10-23</span>
        </div>
    </li>
</ul>
"""

以上这段是我们今天用到的例子,这是文本格式,以下围绕这个来展开

首先,我们要把他转换为HTML网页形式,那就需要用到etree函数了,使用etree之前需要先导包

from lxml import etree
#解析为HTML
html = etree.HTML(text)
print(html)

这时候打印html会发现不是我们想要的结果:

 

 因为HTML网页是不能直接打印出来的,我们需要把它转换为字符串然后进行输出

#如果想看到HTML里的内容需要转换为字符串类型并解码d = etree.tostring(html,encoding=\'utf8\').decode(\'utf8\')print(d)

 

 

 

 这时候输出的就是我们想看到的,所以如果想要看内容一定要进行上述转换

 

 下面我们来提取一些信息,作为练习

####获取所有的div标签
divs = html.xpath(\'//div\')

for div in divs:
    d = etree.tostring(div,encoding=\'utf8\').decode(\'utf8\')
    print(d)
    print(\'*\'*50)
    
####获取某个指定的div标签
div = html.xpath(\'//div[1]\') [0]
    
print(etree.tostring(div,encoding=\'utf8\').decode(\'utf8\'))
    
####获取所有id="even"的div标签
divs = html.xpath(\'//div[@id="even"]\')
for div in divs:
    d = etree.tostring(div,encoding=\'utf8\').decode(\'utf8\')
    print(d)
    print(\'*\'*50)
 
    
####获取所有div的id属性
###/@可以用来获取属性的值
divs = html.xpath(\'//div/@id\')
print(divs)

####获取所有a标签的href属性的值
hrefs = html.xpath(\'//a/@href\')
print(hrefs)

经过上述练习,我们来提取一下div中的所有职位信息

####获取div里所有的职位信息
divs = html.xpath(\'//div\')[1:]
works=[]
for div in divs:     
    work = {}#新建一个空字典
    #获取href
    url = div.xpath(\'.//a/@href\')[0]
    #获取a标签的文本信息
    position = div.xpath(\'.//a/text()\')[0]
    #获取工作类型
    work_type = div.xpath(\'.//span[2]/text()\')[0]
    #获取职位人数
    work_num = div.xpath(\'.//span[3]/text()\')[0]
    #获取工作地点
    area = div.xpath(\'.//span[4]/text()\')[0]
    #获取发布时间
    time = div.xpath(\'.//span[5]/text()\')[0]
    work = {
            "url":url,
            "position":position,
            "work_type":work_type,
            "work_num":work_num,
            "area":area,
            "time":time
            }

    works.append(work)
    print(works)

上述代码跑完会发现:

 

 works里存放了所有的职位信息

 好了,今天的分享结束啦,如果有xpath看不懂的可以留言哦~

 

 

以上是关于爬虫—lxml提取数据的主要内容,如果未能解决你的问题,请参考以下文章

网络爬虫 lxml提取之中国大学排名

Python3网络爬虫实战-3数据库的安装:MySQLMongoDBRedis

Python - 爬虫之数据提取

Python - 爬虫之数据提取

爬虫 - lxml库和贴吧图片下载案例

爬虫-BeautifulSoup