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

使用Selectorlib触发AttributeError错误,请求协助排查原因

解决Selectorlib提取网页内容时的AttributeError错误

错误原因

报错AttributeError: 'str' object has no attribute 'get'的直接原因是extract.yaml配置文件格式错误:css:'#displaytimer'中冒号和值之间没有空格,YAML解析器会把整行识别为一个字符串,而非键值对。Selectorlib期望field_config是字典结构,却拿到了字符串,调用.get()方法时就触发了错误。

修复步骤

1. 修正extract.yaml格式

将原配置中的:

tours:
  css:'#displaytimer'

修改为(冒号后必须加空格,符合YAML语法规范):

tours:
  css: '#displaytimer'

2. 修复主程序中的逻辑错误

原代码还有两处逻辑问题,会导致后续功能失效,一并修正:

  • read函数的参数extracted未被使用,无需传递
  • 判断extracted not in "data.txt"是错误的,应该检查是否在读取到的文件内容content中,而非字符串"data.txt"

修正后的主程序代码:

import requests
import selectorlib


URL = 'http://programmer100.pythonanywhere.com/tours/'
HEADERS = {
    'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36'}

def scrape(url):
    response = requests.get(url, headers=HEADERS)
    source = response.text
    return source

def read():  # 移除无用参数
    with open("data.txt", 'r') as file:
        return file.read()

def extract(source):
    extractor = selectorlib.Extractor.from_yaml_file("extract.yaml")
    value = extractor.extract(source)['tours']
    return value

def send_email():
    print("Email sent")  # 修正拼写错误

def store(extracted):
    with open("data.txt", 'w') as file:
        file.write(extracted+'\n')

if __name__ == "__main__":
    scraped = scrape(URL)  # 修正拼写错误scalped→scraped
    extracted = extract(scraped)
    print(extracted)
    store(extracted)
    content = read()  # 无需传递参数
    if extracted != "No upcoming tours":
        if extracted not in content:  # 检查是否在文件内容中
            send_email()

验证说明

修复后,Selectorlib能正确解析YAML配置中的CSS选择器,提取目标内容;同时修正后的逻辑能正确判断是否需要发送邮件,避免无效触发。

内容的提问来源于stack exchange,提问作者Via4eslav Tka4enko

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 12:17:06