r=re.search(r‘data-original=“(.*?)“‘, line)指令解析

这个错误的核心原因是:re.search() 没有找到匹配的内容,返回了 None,但你直接调用了 None.groups()rNone,没有 groups() 方法)。

结合你之前的代码 r=re.search(r'data-original="(.*?)"', line),我们一步步拆解问题、解决问题:

一、错误根源拆解

1. 先理清逻辑链:
  • 代码逻辑:用正则匹配 line 中的 data-original="..." → 若匹配成功,rMatch 对象(有 groups() 方法);若匹配失败,rNone
  • 错误场景:line 中没有 data-original="..."(或正则写得有问题,导致匹配失败),r 变成 None,后续执行 url=r.groups() 就会报「NoneType 没有 groups() 属性」。
2. 额外坑点(之前正则的隐藏错误):

你之前的正则 r'data-original="(.*?)"' 中,中文全角问号),而正则语法中需要用 英文半角问号?)------ 中文问号会被当作普通字符,导致正则完全匹配不到内容,直接返回 None(这是本次错误的关键诱因!)。

二、解决步骤(两步走,先修正则,再判空)

步骤1:修正正则表达式(核心!)

把中文全角问号 改成英文半角问号 ?,确保正则能正确匹配:

python 复制代码
# 错误正则(中文?)
# r = re.search(r'data-original="(.*?)"', line)

# 正确正则(英文?)
r = re.search(r'data-original="(.*?)"', line)
  • 修正后,正则才能正确识别「非贪婪匹配」,找到 data-original="" 之间的内容。
步骤2:匹配前先判断是否成功(避免 None 报错)

无论正则是否正确,都要先判断 r 是否为 Match 对象(而非 None),再调用 groups()group(1)

python 复制代码
import re

# 假设 line 是从文件/网页中读取的一行内容
line = '<img class="lazy" data-original="https://xxx.com/photo.jpg" alt="风景">'

# 1. 正确的正则匹配
r = re.search(r'data-original="(.*?)"', line)

# 2. 关键:先判断是否匹配成功(r 不是 None)
if r:  # 匹配成功才执行后续操作
    url = r.groups()[0]  # 或更简洁的 r.group(1)
    print("提取到的 URL:", url)
else:  # 匹配失败时的友好处理(可选)
    print(f"未在该行找到 data-original 属性:{line}")

三、关键补充:groups()group(1) 的区别(避免后续踩坑)

  • r.groups():返回所有捕获组的元组(你这里只有 1 个捕获组,所以返回 ('https://xxx.com/photo.jpg',)),需要用 [0] 取第一个元素;

  • r.group(1):直接返回第 1 个捕获组的内容(更简洁,推荐用);

  • 简化写法(匹配成功后):

    python 复制代码
    url = r.group(1)  # 直接获取引号内的内容,无需用 groups()[0]

四、完整代码示例(批量下载图片场景)

结合批量处理的场景,完整代码(含文件读取、正则匹配、判空、下载)参考:

python 复制代码
import re
import requests

# 假设从文件中读取所有行(比如 html 文件)
with open("your_file.html", "r", encoding="UTF-8") as f:
    lines = f.readlines()

# 遍历每一行,提取并下载图片
for line in lines:
    # 1. 正确的正则匹配(英文? + 判空)
    r = re.search(r'data-original="(.*?)"', line)
    if r:
        img_url = r.group(1)
        print(f"正在下载:{img_url}")
        
        # 2. 下载图片(简单示例,可根据需求加异常处理)
        try:
            response = requests.get(img_url, timeout=10)
            response.raise_for_status()  # 抛出 HTTP 错误(如 404、500)
            
            # 3. 保存图片(从 URL 中提取文件名)
            img_name = img_url.split("/")[-1]
            with open(f"images/{img_name}", "wb") as img_f:
                img_f.write(response.content)
            print(f"下载成功:{img_name}")
        except Exception as e:
            print(f"下载失败 {img_url}:{str(e)}")
    # else:
    #     不需要处理未匹配的行,注释掉避免输出冗余信息

五、额外避坑:若仍匹配不到怎么办?

如果修正后还是匹配失败,可能是以下情况,逐一排查:

  1. 属性值用单引号(如 data-original='img.jpg'):修改正则支持单/双引号:

    python 复制代码
    # 同时支持单引号和双引号
    r = re.search(r'data-original=([\'"])(.*?)\1', line)
  2. 引号内有特殊字符(如 &quot;、空格、中文):正则 .*? 已能匹配,无需修改;

  3. line 中没有 data-original 属性:正常情况,忽略即可(或按上面的 else 处理)。

总结

本次错误的核心是「正则中文问号导致匹配失败 → 返回 None 直接调用方法报错」,解决关键:

  1. 正则中用英文半角 ? 而非中文
  2. 匹配后先判断 if r: 再提取内容;
  3. r.group(1) 直接获取目标内容(更简洁)。

按这个方法修改后,就能正常提取 URL 并避免报错了!

相关推荐
jiayou6419 小时前
KingbaseES 实战:深度解析数据库对象访问权限管理
数据库
于眠牧北20 小时前
MySQL的锁类型,表锁,行锁,MVCC中所使用的临键锁
mysql
李广坤2 天前
MySQL 大表字段变更实践(改名 + 改类型 + 改长度)
数据库
Turnip12023 天前
深度解析:为什么简单的数据库"写操作"会在 MySQL 中卡住?
后端·mysql
爱可生开源社区3 天前
2026 年,优秀的 DBA 需要具备哪些素质?
数据库·人工智能·dba
随逸1773 天前
《从零搭建NestJS项目》
数据库·typescript
加号33 天前
windows系统下mysql多源数据库同步部署
数据库·windows·mysql
シ風箏3 天前
MySQL【部署 04】Docker部署 MySQL8.0.32 版本(网盘镜像及启动命令分享)
数据库·mysql·docker
李慕婉学姐4 天前
Springboot智慧社区系统设计与开发6n99s526(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
数据库·spring boot·后端
百锦再4 天前
Django实现接口token检测的实现方案
数据库·python·django·sqlite·flask·fastapi·pip