Python解析数据空显示

描述:问世间bug为何物,直教人欲罢不能。来了来了,今天所描述的是Python爬取网站源码Xpath解析数据时候遇到的一个奇奇怪怪的bug。简单来说就是在浏览器中的Xpath路径显示需要抓取的数据了 但是拿到代码中 tree.xpath(解析)的时候 输出数据一直是空就很 大无语。。。。。。

  1. 在写爬虫的时候解析网页,使用xpath解析,在代码获取到源码数据 且经过测试代码非常肯定正确的情况下获取解析数据扔是空显示
  2. 可以理解为另一种反爬措施,在编写网页的时候通常省略一层标签,但是被省略的标签浏览器会自动补充,修改成正确的结构。。
  3. 我们通过浏览器进行检查的时候,看到的代码结构是已经被浏览器修改后的,而爬虫获取到的是源代码
  4. 所以根据修改后的xpath解析源代码会找不到相应的元素,返回值自然为空所以当使用xpath获取不到向相应的元素的时候,观察一下源码结构,根据源码进行解析  ——来源参考博客

💠一、场景&问题

 在浏览器中编辑Xpath路径定位需要解析的数据

列表获取到的数据是空

💠二、思路解决

1、定位自己获取的content响应数据是否获取到

2、获取的源码结构数据是否和网页中保持一致

浏览器类名

 源码类名

在这里我尝试了 将浏览器响应数据保存到本地 然后通过快捷键Ctrl + R 将不一样的类名进行全局替换 然后解析保存到本地的数据 在进行解析的时候 是报错了  那么后面尝试了直接解析响应数据

但是Xpath中的解析路径 写的是源码中的Class类名即

name_list = tree.xpath('//*[@class = "item"]/img/@alt')

OK 现在好了 然后我就对这个动态的Class类 有点好奇心

💠三、深入思考

  1. 作用:Class用于在纯静态的网页中来控制字体颜色,常用的静态页面有HTML,在这些页面中添加Class可以起到控制全局文字颜色统一的作用。
  2. 那么动态Class就需要用到一些JS知识 用到的思想是开关思想 其代码如下
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>电灯开关</title>
</head>
<body>


<img id="light2" src="img/off.gif" alt="">

<script>
    /*
            分析:
                1.获取图片对象
                2.绑定单击事件
                3.每次点击切换图片
                    * 规则:
                        * 如果灯是开的 on,切换图片为 off
                        * 如果灯是关的 off,切换图片为 on
                    * 使用标记flag来完成

         */
    //1.获取图片对象
    var light2 = document.getElementById("light2");
    var flag = false;//代表灯是灭的。 off图片
    //2.绑定单击事件
    light2.onclick = function () {

        if (flag) {//判断如果灯是开的,则灭掉
            light2.src = "img/on.gif"
            flag = false;
        } else {
            light2.src = "img/off.gif"//如果灯是灭的,则打开
            flag = true;
        }

    }


</script>
</body>
</html>

那么之所以在有些网页中会出现这种动态Class的情况 猜想 要么是一种简单的反爬手段 要么就是二次开发时候 为保持风格的统一 那么之前写好的Class样式 直接拿来引用 害 无心瞎想 

那么之前说的动态Class也是有迹可循的 如果以后自己要写类似的HTML页面 就可以借鉴引用其代码思想啦

还有一种情况就是 图片懒加载

一般涉及到图片的网站都会涉及到懒加载
  • 怎么理解这个懒加载 比如当我滑动页面 还没有将图片显示出来的时候 网页中存储图片的路径是src2 那么当我鼠标滑动到页面的该图片上的那一刻 图片的路径src2立刻就变成了src 其原理和上面所述相同 都是源码数据和网页数据有出入

💠四、完整代码

# _*_ codding : utf-8 _*_
# @Time : 2022/10/3 14:56
# @Auther : 王小哥
# @Project : Project

import urllib.request
from lxml import etree


def create_request(page):
    if (page == 1):
        url = 'https://sc.chinaz.com/tupian/meinvtupian.html'
    else:
        url = 'https://sc.chinaz.com/tupian/meinvtupian_' + str(page) + '.html'

    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36',
    }
    request = urllib.request.Request(url=url, headers=headers)
    return request


def get_content(request):
    response = urllib.request.urlopen(request)
    content = response.read().decode('utf-8')
    with open('sister.html', 'w', encoding='utf-8') as fp:
        fp.write(content)
    return content


def down_load(content):
    # 下载图片
    tree = etree.HTML(content)
    # 获取图片名称
    name_list = tree.xpath('//*[@class = "item"]/img/@alt')

    # 一般涉及到图片的网站都会涉及到懒加载

    # 获取图片
    src_list = tree.xpath('//div[@class = "item"]/img/@data-original')

    for i in range(len(name_list)):
        name = name_list[i]
        src = src_list[i]
        url = 'https:' + src

        urllib.request.urlretrieve(url=url, filename='./Demo/Love_Sister/' + name + '.jpg')


if __name__ == '__main__':
    star_page = int(input("请输入开始页码"))
    end_page = int(input("请输入结束页码"))

for page in range(star_page, end_page + 1):
    # 1、请求对象定制
    request = create_request(page);

    # 2、模拟浏览器发送请求
    content = get_content(request);

    # 3、下载数据(图片)
    down_load(content)

💠五、参考文章

爬虫使用xpath解析时返回为空,获取不到相应的元素的原因和解决办法_小鱼干儿♛的博客-CSDN博客_为什么爬虫爬出来是空的

Js基础(五)动态设置class - 知乎

  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

妙趣生花

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值