xpath库学习

xpath解析是我们在爬虫中最常用也是最通用的一种数据解析方式。

环境安装

pip install lxml

解析原理

  • 使用通用爬虫爬取网页数据
  • 实例化etree对象,且将页面数据加载到该对象中
  • 使用xpath函数结合xpath表达式进行标签定位和指定数据提取

实例化etree对象

- 1.将本地的html文档中的源码数据加载到etree对象中:
            etree.parse(filePath)
- 2.可以将从互联网上获取的源码数据加载到该对象中
            etree.HTML(‘page_text‘)

xpath表达式

   - xpath表达式:
         - xpath(‘xpath表达式‘)
        - /:表示的是从根节点开始定位。表示的是一个层级。
        - //:表示的是多个层级。可以表示从任意位置开始定位。
        - 属性定位://div[@class=‘song‘] tag[@attrName="attrValue"]
        - 索引定位://div[@class="song"]/p[3] 索引是从1开始的。
        - 取文本:
            - /text() 获取的是标签中直系的文本内容
            - //text() 标签中非直系的文本内容(所有的文本内容)
        - 取属性:
            /@attrName     ==>img/src

xpath使用案例

属性定位:
    #找到class属性值为song的div标签
    //div[@class="song"]
层级&索引定位:
    #找到class属性值为tang的div的直系子标签ul下的第二个子标签li下的直系子标签a
    //div[@class="tang"]/ul/li[2]/a
逻辑运算:
    #找到href属性值为空且class属性值为du的a标签
    //a[@href="" and @class="du"]
模糊匹配:
    //div[contains(@class, "ng")]
    //div[starts-with(@class, "ta")]
取文本:
    # /表示获取某个标签下的文本内容
    # //表示获取某个标签下的文本内容和所有子标签下的文本内容
    //div[@class="song"]/p[1]/text()
    //div[@class="tang"]//text()
取属性:
    //div[@class="tang"]//li[2]/a/@href

爬虫分析案例

解析58二手房的相关数据

import requests
from lxml import etree
# 需求:爬取58二手房中的房源信息

if __name__ == "__main__":
    headers = {
        ‘User-Agent‘: ‘Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36‘
    }
    # 爬取到页面源码数据
    url = ‘https://bj.58.com/ershoufang/‘
    page_text = requests.get(url=url, headers=headers).text

    # 数据解析
    tree = etree.HTML(page_text)
    # 存储的就是li标签对象
    li_list = tree.xpath(‘//ul[@class="house-list-wrap"]/li‘)
    fp = open(‘58.txt‘, ‘w‘, encoding=‘utf-8‘)
    for li in li_list:
        # 局部解析
        title = li.xpath(‘./div[2]/h2/a/text()‘)[0]  # ./表示当前解析的li标签为源码参照物
        print(title)
        fp.write(title + ‘\n‘)

解析下载图片数据:

# 需求:解析下载图片数据 http://pic.netbian.com/4kbeijing/
import requests
from lxml import etree
import os
if __name__ == "__main__":
    url = ‘http://pic.netbian.com/4kbeijing/‘
    headers = {
        ‘User-Agent‘: ‘Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36‘
    }
    response = requests.get(url=url, headers=headers)
    # 手动设定响应数据的编码格式
    # response.encoding = ‘utf-8‘
    page_text = response.text

    # 数据解析:src的属性值  alt属性
    tree = etree.HTML(page_text)
    li_list = tree.xpath(‘//div[@class="slist"]/ul/li‘)

    # 创建一个文件夹
    if not os.path.exists(‘./picLibs‘):
        os.mkdir(‘./picLibs‘)

    for li in li_list:
        img_src = ‘http://pic.netbian.com‘ + li.xpath(‘./a/img/@src‘)[0]
        img_name = li.xpath(‘./a/img/@alt‘)[0] + ‘.jpg‘
        # 通用处理中文乱码的解决方案
        # encode(‘iso-8859-1‘)
        # 是将gbk编码编码成unicode编码
        # decode(‘gbk’) 是从unicode编码解码成gbk字符串
        img_name = img_name.encode(‘iso-8859-1‘).decode(‘gbk‘)

        # print(img_name,img_src)
        # 请求图片进行持久化存储
        img_data = requests.get(url=img_src, headers=headers).content
        img_path = ‘picLibs/‘ + img_name
        with open(img_path, ‘wb‘) as fp:
            fp.write(img_data)
            print(img_name, ‘下载成功!!!‘)

解析出所有城市名称

# 项目需求:解析出所有城市名称https://www.aqistudy.cn/historydata/
import requests
from lxml import etree
if __name__ == "__main__":
    # headers = {
    #     ‘User-Agent‘:‘Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36‘
    # }
    # url = ‘https://www.aqistudy.cn/historydata/‘
    # page_text = requests.get(url=url,headers=headers).text
    #
    # tree = etree.HTML(page_text)
    # host_li_list = tree.xpath(‘//div[@class="bottom"]/ul/li‘)
    # all_city_names = []
    # #解析到了热门城市的城市名称
    # for li in host_li_list:
    #     hot_city_name = li.xpath(‘./a/text()‘)[0]
    #     all_city_names.append(hot_city_name)
    #
    # #解析的是全部城市的名称
    # city_names_list = tree.xpath(‘//div[@class="bottom"]/ul/div[2]/li‘)
    # for li in city_names_list:
    #     city_name = li.xpath(‘./a/text()‘)[0]
    #     all_city_names.append(city_name)
    #
    # print(all_city_names,len(all_city_names))
    headers = {
        ‘User-Agent‘: ‘Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36‘
    }
    url = ‘https://www.aqistudy.cn/historydata/‘
    page_text = requests.get(url=url, headers=headers).text

    tree = etree.HTML(page_text)
    # 解析到热门城市和所有城市对应的a标签
    # //div[@class="bottom"]/ul/li/          热门城市a标签的层级关系
    # //div[@class="bottom"]/ul/div[2]/li/a  全部城市a标签的层级关系
    a_list = tree.xpath(
        ‘//div[@class="bottom"]/ul/li/a | //div[@class="bottom"]/ul/div[2]/li/a‘)
    all_city_names = []
    for a in a_list:
        city_name = a.xpath(‘./text()‘)[0]
        all_city_names.append(city_name)
    print(all_city_names, len(all_city_names))

爬取站长素材中免费简历模板

# 项目需求:爬取站长素材中免费简历模板 http://sc.chinaz.com/jianli/free.html

import requests
import os
from lxml import etree

if __name__ == "__main__":
    headers = {
        ‘User-Agent‘: ‘Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36‘
    }
    url = ‘http://sc.chinaz.com/jianli/free.html‘

    # 创建一个文件夹jianlitemplates
    if not os.path.exists(‘./jianlitemplates‘):
        os.mkdir(‘./jianlitemplates‘)
    for page in range(1, 4):  # 分页提取(2-3页)
        if page > 1:
            url = ‘http://sc.chinaz.com/jianli/free_%s.html‘ % page
        # print(url)
        page_text = requests.get(url=url, headers=headers).text
        tree = etree.HTML(page_text)
        jianli_href_list = tree.xpath(
            ‘//div[@class="box col3 ws_block"]/a/@href‘)  # 模板链接
        jianli_name_list = tree.xpath(
            ‘//div[@class="box col3 ws_block"]/a/img/@alt‘)  # 模板标题
        title_list = [t.encode(‘iso-8859-1‘).decode(‘utf-8‘)
                      for t in jianli_name_list]  # 转中文

        for ind, h in enumerate(jianli_href_list):  # 抓取简历模板页
            con_text = requests.get(url=h, headers=headers).text
            con_tree = etree.HTML(con_text)
            con_href = con_tree.xpath(
                ‘//div[@class="clearfix mt20 downlist"]/ul/li/a/@href‘)[0]  # 得到下载链接
            print(con_href, title_list[ind])
            wrd_path = ‘jianlitemplates/‘ + title_list[ind] + ‘.rar‘
            # 请求模板进行持久化存储
            wrd_data = requests.get(url=con_href, headers=headers).content
            with open(wrd_path, ‘wb‘) as fp:  # 保存简历模板
                fp.write(wrd_data)
                print(title_list[ind], ‘下载成功!!!‘)

原文地址:https://www.cnblogs.com/xiao-apple36/p/12054370.html

时间: 2024-10-19 22:19:13

xpath库学习的相关文章

【python标准库学习】thread,threading(二)多线程同步

继上一篇介绍了python的多线程和基本用法.也说到了python中多线程中的同步锁,这篇就来看看python中的多线程同步问题. 有时候很多个线程同时对一个资源进行修改,这个时候就容易发生错误,看看这个最简单的程序: import thread, time count = 0 def addCount(): global count for i in range(100000): count += 1 for i in range(10): thread.start_new_thread(ad

【python标准库学习】thread,threading(一)多线程的介绍和使用

在单个程序中我们经常用多线程来处理不同的工作,尤其是有的工作需要等,那么我们会新建一个线程去等然后执行某些操作,当做完事后线程退出被回收.当一个程序运行时,就会有一个进程被系统所创建,同时也会有一个线程运行,这个线程就是主线程main,在主线程中所创建的新的线程都是子线程,子线程通常都是做一些辅助的事.python中提供了thread和threading两个模块来支持多线程. python中使用线程有两种方式,第一种是用thread模块的start_new_thread函数,另一种是用threa

xpath的学习

xpath的学习 xpath的作用就是两个字“定位”,运用各种方法进行快速准确的定位,推荐两个非常有用的的firefox工具:firebug和xpath checker 定位 1.依靠自己属性,文本定位 //td[text()='xxx'] //div[contains(@class,'xxx')] //div[@class='xxx' and @type='xxx'] 2.依靠父节点定位 //div[@class='xxx']/div //div[@id='xxx']/div 3.依靠子节点定

0806------Linux网络编程----------Echo 网络库 学习笔记

1.Echo网络库的编写 1.1 Echo网络库1.0 1.1.1 Echo网络库 1.0 框架分析 a)class InetAddress: 主要用来定义一个struct sockaddr_in 结构(用自定义端口号初始化),并提供获取这个结构体成员如IP.Port等的接口: b)class Socket : 主要用来把一个普通的 sockfd 变为 listenfd(这里用一个sockfd初始化对象),提供bind .listen.accept 等接口. c)class TcpConnect

c++ boost库学习三:实用工具

noncopyable 大家都知道定义一个空类的时候,它实际包含了构造函数,拷贝构造函数,赋值操作符和析构函数等. 这样就很容易产生一个问题,就是当用户调用A a(“^_^") 或者A c="^_^" 时会发生一些意想不到的行为,所以很多时候我们需要禁用这样的用法. 一种方法就是把拷贝构造函数和赋值操作符显式的定义为private,但是这样需要很多代码. 于是boost库为大家提供了一个简单的方法:只需要将类继承于noncopyable就可以了. #include "

C++标准模板库学习。。。

作为C++标准库相当重要的一部分,STL库提供一系列组件操作.它主要可以分为容器.迭代器.基本算法.函数对象以及内存分配器和配接器六个部分.整个STL库的代码都采用模板函数以及模板类的方式实现,具有高度的通用性.对于传统的应用程序来讲,模板库支持并且倡导一种新的编程风格,即称为泛型编程思想,以通用的模板方式来编写应用程序中的数据结构与算法. 16.1  STL常见容器 C++标准STL库中封装实现了常见数据结构,并以容器的方式提供给用户使用.STL容器主要包含vector向量.deque队列.l

python第三方库学习之xlrd读取Excel文件

因为经常会涉及到从Excel表中导数据,所以就学习了python的xlrd来读取excel中的数据. 1.xlrd的安装 xlrd是python的第三方库,所以是需要自己安装的,可以在python的官网http://pypi.python.org/pypi/xlrd下载该模块来安装,也可以通过其他手段,比如easy_install或者pip啥的,我已经安装好pip所以就用最懒的方式来安装了pip install xlrd来安装. 2.分析excel文件的层级对象 要读取excel的数据,就要了解

2 C++ ACE 面向对象跨平台网络库学习

2   C++ ACE  面向对象跨平台网络库学习  ACE I/O相关对象 阻塞式 TCP连接Linux Kernel网站服务器的443端口 非阻塞模式 TCP连接百度服务器 设置 TCP连接超时: ACE 客户端 TCP模式.请求HTTP 一个简单的 TCP HTTP server HTTP server 代码 创建网页文件 浏览器测试访问结果 ACE UDP通信单播测试: UDP 单播 服务器端: UDP 单播 客户端: ACE UDP 多播实验: UDP 多播 发送端程序: UDP 多播

python标准库学习-random

想想这么多年,也是没有好好梳理一下自己的知识体系,以至于总是会有书到用时方恨少的遗憾. 最近既然有学习的动力,干脆就趁着这份工作不是特别忙的机会,写一点东西吧,也理理自己的逻辑思维能力. python有哪些库? 这个问题呢可以参照http://blog.csdn.net/python_wangjunji/article/details/8689297这篇博文来看. 当然咯,首先要先推荐一个可厉害的学习程序:Dash.学编程必备查询库,各种语言,专治"我要看源码病". 那第一篇呢,我就先