xpath的基本语法
- 路径查询
//:查找所有子节点,不考虑层级关系
/:找直接子节点 - 谓词查询
//div[@id]
//div[@id=“maincontent”] - 属性查询
//@class - 模糊查询
//div[contains(@id,“he”)]
//div[starts-with(@id,“he”)] - 内容查询
//div/h1/text()
可以理解为将查询到的内容解析 - 逻辑运算
//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)