使用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
相关产品推荐
相关产品推荐

