爬虫系列笔记七xpath

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_dowm”]
    //title | //price

先用本地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" class="c2">上海</li>
		<li id="cl">深圳</li>
		<li id="c2">武汉</li>
	</ul>
	<ul>
		<li>大连</li>
		<li>锦州</li>
		<li>沈阳</li>
	</ul>

</body>
</html>
from lxml import etree

# xpath解析本地文件

tree=etree.parse('C:/Users/86177/Desktop/tese/python/爬虫再学/test.html')
result=etree.tostring(tree)

# xpath的基本语法
# 1.路径查询
# //:查找所有子节点,不考虑层级关系
# /:找直接子节点

li_list=tree.xpath('//body/ul//li/text()')
print('路径查找:',li_list)

# 2.谓词查询
# //div[@id]
# //div[@id="maincontent"]

# 查找所有有id属性的li标签
li_list=tree.xpath('//ul//li[@id]/text()')
print('查找所有有id属性的li标签:',li_list)

# 找到id为l1的li标签
li_list=tree.xpath('//ul/li[@id="l1"]/text()')
print('找到id为l1的li标签:',li_list)

# 3.属性查询
# //@class
# 查找到id为l1的li标签的class的属性值
li_list=tree.xpath('//ul/li[@id="l1"]/@class')
print('查找到id为l1的li标签的class的属性值:',li_list)

# 4.模糊查询
# //div[contains(@id,"he")]
# //div[starts-with(@id,"he")]

# contains函数查找id中包含l的标签
li_list=tree.xpath('//ul/li[contains(@id,"l")]/text()')
print('contains函数查找id中包含l的标签:',li_list)

# starts-with函数查找id中以l开头的标签
li_list=tree.xpath('//ul/li[starts-with(@id,"l")]/text()')
print('starts-with函数查找id中以l开头的标签:',li_list)

# 5.内容查询
# //div/h1/text()
# 可以理解为将查询到的内容解析
# 6.逻辑运算
# //div[@id="head" and @class="s_dowm"]
# //title | //price

# 查询id为l1和class为c1的
li_list=tree.xpath('//ul/li[@id="l1" and @class="c1"]/text()')
print('查询id为l1和class为c1的:',li_list)

# 查询id为l1或class为c2的
li_list=tree.xpath('//ul/li[@id="l1" or @class="c2"]/text()')
print('查询id为l1或class为c2的:',li_list)

在这里插入图片描述

xpath具体使用–爬取站长素材网站中的图片

在这里插入图片描述
在这里插入图片描述
通过对比不同页面的url地址发现
第一页的地址为:https://sc.chinaz.com/tupian/
第二页的地址为:https://sc.chinaz.com/tupian/index_2.html
第三页的地址为:https://sc.chinaz.com/tupian/index_3.html
可以看出url的地址组成为:https://sc.chinaz.com/tupian/+index_+页数+.html

在这里插入图片描述
在这里插入图片描述
通过观察源码可以找出图片的地址,用xpath定位具体位置

import urllib.request
from lxml import etree

#请求对象定制
def create_request(page):
    if page==1:
        url='https://sc.chinaz.com/tupian/'
    else:
        url='https://sc.chinaz.com/tupian/index_'+str(page)+'.html'

    headers={
        'Cookie': 'cz_statistics_visitor=4e613a73-3d6a-d502-edcd-d76f727bd82b; Hm_lvt_398913ed58c9e7dfe9695953fb7b6799=1665361278,1665363203; Hm_lpvt_398913ed58c9e7dfe9695953fb7b6799=1665363691',
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36'
    }
    request=urllib.request.Request(url=url,headers=headers)
    return request

#获取数据
def get_content(request):
    respons=urllib.request.urlopen(request)
    content=respons.read().decode('utf-8')
    return content
#下载图片
def down_lode(content):
    tree=etree.HTML(content)

    #解析图片的名称和路径
    name_list=tree.xpath('//div[@class="item"]//img/@alt')
    src_list=tree.xpath('//div[@class="item"]//img/@data-original')
    # print(len(name_list),len(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='D:/love/'+name+'.jpg')#下载到指定位置

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

    for page in range(start_page,end_page+1):
        #(1)请求对象的定制
        request=create_request(page)
        #(2)获取网页的源码
        content=get_content(request)
        #(3)下载
        down_lode(content)

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值