爬虫-xpath解析

一、xpath解析原理:
1、实例化一个etree的对象,且需要讲被解析的页面源码数据加载到该对象中

2、调用etree对象中的xpath方法,结合着xpath表达式实现标签的定位和内容的获取

第一步:安装模块

 

 pip install lxml

第二步使用流程

from lxml import etree
如何实例化一个对象:
    1、将本地的html文档中的源代码数据加载到etree对象中
        etree.parse(filePath)
    2、可以讲互联网上的数据源码加载到该对象中
        etree.HTML('page_text')
    3、xpath('xpath表达式')

 

实例说明:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
from lxml import etree
<html lang="en">
    <head>
        <meta charset="UTF-8" />
        <title>Title</title>
    </head>
    <body>
        <div class="链接">
            <ul>
                <li><a href="http://www.baidu.com">百度</a></li>
                <li><a href="http://www.google.com">谷歌</a></li>
                <li><a href="http://www.sogou.com">搜狗</a></li>
            </ul>
            <ol>
                <li><a href="feiji">飞机</a></li>
                <li><a href="dapao">大炮</a></li>
                <li><a href="huoche">火车</a></li>
            </ol>
        </div>
        <div class="job">李嘉诚</div>
        <div class="common">胡辣汤</div>
    </body>
</html>
"""
tree = etree.parse("b.html")
result = tree.xpath('/html')   #[<Element html at 0x13193379180>]
result = tree.xpath('//div[@class ="链接"]//a/text()') #['百度', '谷歌', '搜狗', '飞机', '大炮', '火车']<class 'list'>
result = tree.xpath('/html/body/div[1]/ul/li[1]/a/text()')        # xpath的顺序是从1开始数的, []表示索引   #['百度']
result = tree.xpath('/html/body/div/ol/li/a[@href="dapao"]/text()')  # [@xxx=xxx] 属性的筛选  ['大炮']
 
ol_li_list = tree.xpath("/html/body/div[1]/ol/li")#得到ol下的所有li标签
for li in ol_li_list:                      #遍历循环
    # 从每一个li中提取到文字信息
    text = li.xpath("./a/text()")  # 在li中继续去寻找. 相对查找
    href = li.xpath("./a/@href")  # 拿到属性值: @属性
    print(text , href)

 实例一、爬取往网站为https://xinzhuobu.com/?cat=2&paged=1的图片

网页分析:

 利用xpath复制得到在class = row posts-wrapper 下面的所有div的标签:复制xpath路径可以得到:

1
/html/body/div/div[3]/div/div[2]/div/div/main/div            #又因为main下面两个div,这里选择第一个,写法如下<br>/html/body/div/div[3]/div/div[2]/div/div/main/div[1]/div

 运行后可以得到很多div标签,然后在当前的div下面在获取得到data-src超链接和alt的文本就可以保存到本地中

   for div in divs:
      pic_name = div.xpath('./article/div[1]/div/a/img/@alt')[0]
      pic_src = div.xpath('./article/div[1]/div/a/img/@data-src')[0]

完整代码如下:

复制代码
 #准备一个url地址
   url = "https://xinzhuobu.com/?cat=2"
   #UA伪装
   headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.5005.63 Safari/537.36 Edg/102.0.1245.30"}
   resp = requests.get(url=url,headers = headers)
   #实例化一个etree对象,把html数据源码发到etree对象中
   html = etree.HTML(resp.text)

   divs = html.xpath('/html/body/div/div[3]/div/div[2]/div/div/main/div[1]/div')
   for div in divs:
      pic_name = div.xpath('./article/div[1]/div/a/img/@alt')[0]
      pic_src = div.xpath('./article/div[1]/div/a/img/@data-src')[0]
      print(f"{pic_name},{pic_src}")  # f-string
      img_data = requests.get(url=pic_src,headers=headers).content
      #保存数据
      with open( image + '/' + pic_name + '.jpg','wb')as fp:
         fp.write(img_data)
         print(pic_name + '下载完成!!')
         print('over')
复制代码

运行得到结果:

 

posted @   zhang0513  阅读(44)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 使用C#创建一个MCP客户端
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示