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 并避免报错了!

相关推荐
2301_783360131 小时前
R语言机器学习系列|随机森林模型特征重要性排序的R语言实现
随机森林·机器学习·r语言
v***5652 小时前
使用bitnamiredis-sentinel部署Redis 哨兵模式
数据库·redis·sentinel
2501_941111822 小时前
使用Python进行网络设备自动配置
jvm·数据库·python
m***11903 小时前
MySQL官网驱动下载(jar包驱动和ODBC驱动)【详细教程】
数据库·mysql
debug骑士3 小时前
云原生边缘计算系统在工业物联网中的实时智能调度与优化策略研究
mysql
chxii3 小时前
第六章:MySQL DQL 表之间的关系 自连接 一对一、一对多、多对一、多对多
java·前端·mysql
煎蛋学姐4 小时前
SSM基于J2EE的山西旅游网站的设计与实现iiqmx(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
java·数据库·java-ee·ssm 框架·山西旅游网站·在线预订系统
咸甜适中4 小时前
rust语言,将JSON中的所有值以字符串形式存储到sqlite数据库中(逐行注释)
数据库·rust·sqlite·json
树下水月4 小时前
python 连接hive2 数据库
开发语言·数据库·python