You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python遍历URL检索指定关键词报AttributeError解决方法

报错根因

触发AttributeError: 'list' object has no attribute 'lower'的核心原因有两处:

  1. 初始定义的cci_words是存储多个关键词的列表类型,.lower()是字符串专属方法,直接对列表调用该方法必然抛出类型错误。
  2. 循环内部将cci_words变量重新赋值为匹配到的文本片段组成的列表,下一轮循环执行时,该变量已经不是最初定义的待检测关键词列表,类型错误会持续触发,同时匹配逻辑完全失效。

原代码还附带几个会导致运行异常/结果不准的问题:

  • requests.get传入的URL没有带http/https协议头,会直接触发请求异常
  • r.content返回的是字节类型数据,直接调用.lower()同样会触发类型错误
  • 匹配逻辑写反:原写法是判断整个关键词列表是否为文本的子串,实际需求应该是判断文本中是否包含任意一个预设关键词
修复方案

按以下逻辑调整代码即可正常运行:

  • 拆分变量命名:预定义的目标关键词列表和循环内匹配到的结果变量用不同名称存储,禁止覆盖原关键词变量
  • 提前将所有目标关键词统一转为小写,匹配时将页面文本也转为小写,实现不区分大小写的匹配,避免对非字符串类型调用字符串方法
  • 先将响应返回的字节流解码为字符串,再做小写化、DOM解析操作
  • 调整匹配逻辑:遍历页面文本节点时,逐一检查节点内容是否包含任意一个目标关键词
  • 补充基础的请求超时、异常捕获逻辑,避免单URL请求失败导致整个程序中断
修复后完整代码
import requests
from bs4 import BeautifulSoup

# 注意URL需补全http/https协议头
url_list = ['https://website1.com', 'https://website2.com']
# 预定义待检测关键词,提前统一转小写用于不区分大小写匹配
target_keywords = [word.lower() for word in ['Risk Management', 'Labor', 'Migrant Workers']]
total_matched = []

for url in url_list:
    try:
        # 设置请求超时,避免长时间卡死
        resp = requests.get(url, allow_redirects=False, timeout=10)
        # 将字节类型的响应内容解码为字符串后统一转小写
        page_content = resp.content.decode('utf-8', errors='ignore').lower()
        soup = BeautifulSoup(page_content, 'lxml')

        current_matched = []
        # 遍历页面所有文本节点
        for text_node in soup.find_all(string=True):
            stripped_text = text_node.strip()
            if not stripped_text:
                continue
            # 检查当前文本是否命中任意目标关键词
            for kw in target_keywords:
                if kw in stripped_text:
                    current_matched.append(stripped_text)
                    break
        
        # 单URL结果去重
        current_matched = list(set(current_matched))
        match_count = len(current_matched)
        total_matched.extend(current_matched)

        print(f'\nUrl: {url}\n匹配到关键词的文本片段数量: {match_count}\n匹配内容: {current_matched}')
    except Exception as e:
        print(f'\nUrl: {url}\n请求/解析失败,错误信息: {str(e)}')

total_count = len(total_matched)
print(f'\n所有URL累计匹配到的相关文本片段总数: {total_count}')
关键修改说明
  • 原cci_words关键词列表重命名为target_keywords,循环内匹配结果用current_matched存储,彻底解决变量覆盖导致的类型错误
  • 修正了字符串方法的调用对象:仅对字符串类型的关键词、文本内容调用.lower(),不再对列表类型调用该方法
  • 修正了响应内容的类型处理:先解码字节流为字符串再做后续操作,避免字节类型调用字符串方法的异常
  • 匹配逻辑调整为符合需求的“文本包含关键词”判断,不会出现逻辑反向的问题
  • 增加异常捕获和超时配置,程序鲁棒性更强

内容的提问来源于stack exchange,提问作者Catalina Garcia

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 22:36:23