【爬虫】第四部分 xpath

本文介绍XPath的基础语法及使用方法,包括如何解析HTML文档、选取特定元素及其属性,并通过具体案例展示批量下载图片的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

【爬虫】第四部分 xpath



4. xpath

4.1 准备工作

下载xpath插件,可以在网上找有很多,下载完后将其放入浏览器中,当出现这个小黑框的时候就证明已经安装成功了!

在这里插入图片描述

pip install lxml

4.2 xpath基础语法

from lxml import etree

# 解析本地文件
tree = etree.parse('baodu.html')

# 解析服务器响应文件
tree = etree.HTML(response.read().decode('utf-8'))

注意:如果在运行的过程中遇到lxml.etree.XMLSyntaxError: Opening and ending tag mismatch: meta line 6 and head, line 8, column 8这个报错只需要在html中meta标签加 / ,形成闭合标签就行。

<meta charset="UTF-8">  
<meta charset="UTF-8"/>
from lxml import etree

# 解析本地文件
tree = etree.parse('./test.html')

"""
    // : 表示的是后代元素
    / : 表示的是子代元素
    text() : 表示是读取标签中的内容
    [@class] : 表示class属性
    [@id] : 表示id属性
    [@属性名] :表示该属性
    [contains(属性名,'模糊匹配的字符')] :模糊匹配
    [starts-with(属性名,'以什么字符开头')] :匹配开头
"""
# 查找所有的li标签,并且读取li的值
data = tree.xpath('//li/text()')
data = tree.xpath('//ul/li/text()')

# 查找带有id属性的li标签
data = tree.xpath('//ul/li[@id]/text()')

# 查找带有class属性的li标签
data = tree.xpath('//ul/li[@class]/text()')

# 查找class为qz的li标签
data = tree.xpath('//ul/li[@class="qz"]/text()')

# 查找id为city的li标签
data = tree.xpath('//ul/li[@id="city"]/text()')

# 查找class属性值中包含a的li标签
data = tree.xpath('//ul/li[contains(@class,"a")]/text()')

# 查找class属性中以a开头的li标签
data = tree.xpath('//ul/li[starts-with(@class,"a")]/text()')

# 查找带有title属性的li标签
data = tree.xpath('//ul/li[@title="shanghai"]/text()')

# 读取class属性的值
data = tree.xpath('//ul/li[@class]/@class')
print(data)

4.3 案例

获取百度一下文字

import urllib.request
from lxml import etree

url = 'https://www.xxx.com'
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36'
}

# 伪装
request = urllib.request.Request(url=url,headers=headers)
# 模拟浏览器发请求获取数据
response = urllib.request.urlopen(request).read().decode('utf-8')
# 解析获取到的数据
tree = etree.HTML(response)
# 提取出满足条件的数据
data = tree.xpath('//input[@id="su"]/@value')
print(data)

批量下载图片

import urllib.request
from lxml import etree

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36',
    'Referer': 'https://sc.xxx.com/',
    'Cookie': 'cz_statistics_visitor=086cd776-2a61-9683-d6d4-8a49a8f455d8; Hm_lvt_398913ed58c9e7dfe9695953fb7b6799=1666853343; ASP.NET_SessionId=pz1abstpd3llmckywg4ed24z; Hm_lpvt_398913ed58c9e7dfe9695953fb7b6799=1666853360'
}


def getPicture(headers, page):
    if page == 1:
        url = 'https://sc.xxx.com/tu/touxiang.html'
    else:
        url = f'https://sc.xxx.com/tu/touxiang-{page}-0-0.html'

    # 伪装
    request = urllib.request.Request(url=url, headers=headers)
    # 发请求
    response = urllib.request.urlopen(request).read().decode('utf-8')
    # 解析服务器返回的数据
    tree = etree.HTML(response)
    # 筛选
    src = tree.xpath('//div[@id="ulcontent"]//div[@class="new_block"]//img/@data-src')
    name = tree.xpath('//div[@id="ulcontent"]//div[@class="new_block"]//img/@alt')

    # 下载图片
    for i in range(len(src)):
        Name = name[i]
        s = src[i].replace('\\', '/')
        Src = f"https:{s}"
        urllib.request.urlretrieve(url=Src, filename='./Image/' + Name + '.jpg')


if __name__ == '__main__':
    start = int(input('请输入起始页:'))
    end = int(input('请输入结束页:'))
    for i in range(start, end + 1):
        getPicture(headers=headers, page=i)


总结

以上就是今天要讲的内容,希望对大家有所帮助!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值