目录

1.安装xpath

2.安装lxml的库

3.xpath基本语法

4.案例一:获取百度网站的百度一下字样

5.案例二:爬取站长素材网上的前十页照片


1.安装xpath

打开谷歌浏览器 --> 点击右上角小圆点 --> 更多工具 --> 扩展程序

 下载xpath压缩包,下载地址:阿里云盘分享

把压缩包解压到指定目录 --> 选择加载已解压的拓展程序 --> 选择刚才解压的路径目录

 关闭谷歌浏览器,重新打开,使用快捷键:ctrl+shift+x 就可以看到浏览器上面的黑框了,此时说明配置成功。(注意:这个快捷键可能与其他浏览器的快捷键冲突,使用时可以关闭其他浏览器或者更改浏览器的快捷方式) 

2.安装lxml的库

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

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

         在文件夹中打开相应的目录,并且进入该目录下的命令窗口。

         使用命令安装lxml库。

pip install lxml -i https://pypi.douban.com/simple

         此时,我们安装lxml库就已经完成。

3.xpath基本语法

1. 路径查询
        //:查找所有子孙节点,不考虑层级关系
        / :找直接子节点
2. 谓词查询
        //div[@id]
        //div[@id="maincontent"]
3. 属性查询
        //@class
4. 模糊查询
        //div[contains(@id, "he")]
        //div[starts‐with(@id, "he")]
5. 内容查询
        //div/h1/text()
6. 逻辑运算
        //div[@id="head" and @class="s_down"]
        //title | //price

         新建一个页面,注意在修改<meta charset="UTF-8">为:<meta charset="UTF-8"/>

<!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文件 

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))

4.案例一:获取百度网站的百度一下字样

         编写代码

import urllib.request
from lxml import etree


url = 'https://www.baidu.com/'

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

# 请求对象定制
request = urllib.request.Request(url=url,headers=headers)

# 模拟浏览器访问服务器
response = urllib.request.urlopen(request)

# 获取网页源码
content = response.read().decode('utf-8')

# 解析网页源码   解析服务器响应的文件 etree.HTML(response.read().decode('utf‐8')
tree = etree.HTML(content)

# 获取想要的数据  xpath的返回值是一个列表类型的数据
result = tree.xpath('//input[@id="su"]/@value')[0]

print(result)

        浏览器中xpath插件主要用处是为代码中解析服务器响应文件提供参数路径。

5.案例二:爬取站长素材网上的前十页照片

        查看不同网页的url之间的规律。

         编写代码:

#  需求  下载站长素材前10页图片

# https://sc.chinaz.com/tupian/qinglvtupian.html
# https://sc.chinaz.com/tupian/qinglvtupian_2.html
# https://sc.chinaz.com/tupian/qinglvtupian_3.html
# ...
# 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; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 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):
    # 解析网页源码
    tree = etree.HTML(content)

    name_list = tree.xpath('//div[@class="container"]//img/@alt')
    # 一般涉及到图片的网页一般会使用懒加载
    src_list = tree.xpath('//div[@class="container"]//img/@data-original')

    for i in range(len(name_list)):
        name = name_list[i]
        src = src_list[i]
        url = 'https:' + src
        urllib.request.urlretrieve(url=url,filename= './love_img/' + name + '.jpg')  #下载到指定路径下

if __name__ == '__main__':
    start_page = int(input('请输入起始页码:'))
    end_page = int(input('请输入结束页码:'))

    for page in range(start_page,end_page+1):
        request = create_request(page)
        content = get_content(request)
        down_load(content)

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐