【爬虫】第四部分 xpath

导读:本篇文章讲解 【爬虫】第四部分 xpath,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

【爬虫】第四部分 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)


总结

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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之家整理,本文链接:https://www.bmabk.com/index.php/post/82828.html

(0)
小半的头像小半

相关推荐

极客之家——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!