爬虫-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表达式')

 

实例说明:

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路径可以得到:

/html/body/div/div[3]/div/div[2]/div/div/main/div            #又因为main下面两个div,这里选择第一个,写法如下
/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 @ 2023-12-16 21:11  zhang0513  阅读(15)  评论(0编辑  收藏  举报