python爬虫数据解析xpath

一、环境配置

1、安装xpath

下载地址:百度网盘 请输入提取码

第一步:

下载好文件后会得到一个没有扩展名的文件,重命名该文件将其改为.rar或者.zip等压缩文件,解压之后会得到一个.crx文件和一个.pem文件。新建一个文件夹,将这两个文件放在该文件夹(本人将其命名为xpath-helper)内。

第二步:

将.crx文件重命名,改为.rar或.zip文件,解压在xpath-helper文件夹中,解压后会得到许多文件如下图

第三步:

打开Chrome浏览器,进入扩展程序页面,选择右上角的开发者模式,之后点击左上角的加载已解压的扩展程序,选择xpath-helper文件夹,这样在浏览器中就会出现XPath-Helper了。

2、安装lxml的库

想要使用xpath,我们还必须安装一个名为lxml的库,这个库安装的目录必须在python的解释器路径下。

首先,我们查看python解释器的路径。打开pycharm --> file -->settings -->Project

点击加号直接搜索安装或者命令行安装:

bash 复制代码
pip install lxml

二、xpath基本语法

1、基础语法

  1. 路径查询

//:查找所有子孙节点,不考虑层级关系

/ :找直接子节点

  1. 谓词查询

//div[@id]

//div[@id="maincontent"]

  1. 属性查询

//@class

  1. 模糊查询

//div[contains(@id, "he")]

//div[starts‐with(@id, "he")]

  1. 内容查询

//div/h1/text()

  1. 逻辑运算

//div[@id="head" and @class="s_down"]

//title | //price

新建一个HTML

html 复制代码
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8"/>
    <title>Title</title>
</head>
<body>
    <ul>
        <li id="l1" class="c1">北京</li>
        <li id="l2">上海</li>
        <li id="c3">深圳</li>
        <li id="c4">武汉</li>
    </ul>

</body>
</html>

编写python文件

python 复制代码
from lxml import etree
 
# lxml解析本地文件                        etree.parse('XX.html')
# lxml解析服务器响应文件                   etree.HTML(response.read().decode('utf‐8')
tree = etree.parse('1.html')
 
# tree.xpath(xpath路径)
 
# 查找ul下面的li
li_list = tree.xpath('//body/ul/li')
 
# 查找所有有id属性的li标签
# text()    获取标签中的内容
li_list = tree.xpath('//ul/li[@id]/text()')
 
# 找到id为l1的li标签  注意引号的问题
li_list = tree.xpath('//ul/li[@id="l1"]/text()')
 
# 查找到id位l1的li标签的class的属性值
li = tree.xpath('//ul/li[@id="l1"]/@class')
 
# 查询id中包含l的li标签
li_list = tree.xpath('//ul/li[contains(@id,"l")]/text()')
 
# 查询id的值以c开头的li标签
li_list = tree.xpath('//ul/li[starts-with(@id,"c")]/text()')
 
# 查询id为l1和class为c1的li标签
li_list = tree.xpath('//ul/li[@id="l1" and @class="c1"]/text()')
 
#查询id为l1或id为l2的li标签
li_list = tree.xpath('//ul/li[@id="l1"]/text() | //ul/li[@id="l2"]/text()')
 
# 判断列表的长度
print(li_list)
print(len(li_list))

2、案例:爬取站长素材网上的前十页照片

python 复制代码
# (1) 请求对象的定制
# (2)获取网页的源码
# (3)下载


# 需求 下载的前十页的图片
# https://sc.chinaz.com/tupian/qinglvtupian.html   1
# https://sc.chinaz.com/tupian/qinglvtupian_page.html

import urllib.request
from lxml import etree

def create_request(page):
    if(page == 1):
        url = 'https://sc.chinaz.com/tupian/qinglvtupian.html'
    else:
        url = 'https://sc.chinaz.com/tupian/qinglvtupian_' + str(page) + '.html'

    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36',
    }

    request = urllib.request.Request(url = url, headers = headers)
    return request

def get_content(request):
    response = urllib.request.urlopen(request)
    content = response.read().decode('utf-8')
    return content


def down_load(content):
#     下载图片
    # urllib.request.urlretrieve('图片地址','文件的名字')
    tree = etree.HTML(content)

    name_list = tree.xpath('//div[@class="item"]//img/@alt')

    # 一般设计图片的网站都会进行懒加载
    src_list = tree.xpath('//div[@class="item"]//img/@data-original')
    print(src_list)

    for i in range(len(name_list)):
        name = name_list[i]
        src = src_list[i]
        url = 'https:' + src

        urllib.request.urlretrieve(url=url,filename='./loveImg/' + name + '.jpg')



if __name__ == '__main__':
    start_page = 1
    end_page = 10

    for page in range(start_page,end_page+1):
        # (1) 请求对象的定制
        request = create_request(page)
        # (2)获取网页的源码
        content = get_content(request)
        print(content)
        with open('爬虫_解析_站长素材.html','w',encoding='utf-8')as fp:
            fp.write(content)

        # (3)下载
        down_load(content)
相关推荐
hopetomorrow9 分钟前
学习路之PHP--使用GROUP BY 发生错误 SELECT list is not in GROUP BY clause .......... 解决
开发语言·学习·php
小牛itbull19 分钟前
ReactPress vs VuePress vs WordPress
开发语言·javascript·reactpress
请叫我欧皇i28 分钟前
html本地离线引入vant和vue2(详细步骤)
开发语言·前端·javascript
nuclear201130 分钟前
使用Python 在Excel中创建和取消数据分组 - 详解
python·excel数据分组·创建excel分组·excel分类汇总·excel嵌套分组·excel大纲级别·取消excel分组
躺平的花卷30 分钟前
Python爬虫案例八:抓取597招聘网信息并用xlutils进行excel数据的保存
爬虫·excel
闲暇部落30 分钟前
‌Kotlin中的?.和!!主要区别
android·开发语言·kotlin
GIS瞧葩菜39 分钟前
局部修改3dtiles子模型的位置。
开发语言·javascript·ecmascript
chnming198744 分钟前
STL关联式容器之set
开发语言·c++
Lucky小小吴1 小时前
有关django、python版本、sqlite3版本冲突问题
python·django·sqlite
熬夜学编程的小王1 小时前
【C++篇】深度解析 C++ List 容器:底层设计与实现揭秘
开发语言·数据结构·c++·stl·list