Python 3.x函数变量引用错误排查及URL内容监控脚本修复
嘿,我来帮你搞定这两个问题,咱们一个个说清楚:
问题1:变量引用与函数设计问题
你现在用scrape.soup给函数绑定属性的方式其实不太规范,IDE提示找不到引用是因为这种动态绑定的属性在静态检查时识别不到。更关键的是,你的scrape()函数没有返回值,调用后得到的是None,这也是后面判断逻辑全错的根源之一。
正确的做法是让scrape()函数直接返回解析后的BeautifulSoup对象,这样外部可以直接获取内容,不用绕函数属性的弯路。
问题2:循环逻辑与判断错误
你当前的代码里,第一次调用scrape()得到None,和scrape.soup对比肯定不相等,所以直接触发Something Changed!然后break跳出循环,自然只执行一次。
要实现循环对比的逻辑,你需要:
- 先获取初始版本的页面内容作为基准
- 进入循环后,每隔指定时间获取新版本的内容
- 对比新旧版本的内容(注意:直接对比soup对象可能不准,最好对比文本或者哈希值)
- 根据对比结果输出提示,然后把新版本内容更新为下一次的基准
修正后的完整代码
from bs4 import BeautifulSoup import requests import time sleeptime = 15 url = "http://www.pythonforbeginners.com" # 把URL提到外面,不用每次函数里重复定义 def scrape(): source_code = requests.get(url) source_code.raise_for_status() # 加上这个,请求失败时会抛出异常,方便排查问题 plain_text = source_code.text return BeautifulSoup(plain_text, 'html.parser') # 先获取初始页面内容作为基准 previous_soup = scrape() while True: time.sleep(sleeptime) # 先sleep,避免一开始就重复请求 current_soup = scrape() # 对比页面文本内容(也可以对比特定标签的内容,比如current_soup.find('div', class_='xxx').text) if previous_soup.get_text(strip=True) == current_soup.get_text(strip=True): print('Nothing Changed') else: print("Something Changed!") previous_soup = current_soup # 更新基准内容,下次对比用新的 # 如果需要停止循环,可以加个条件,比如按Ctrl+C中断,或者设置循环次数
额外优化建议
- 直接对比整个页面的文本可能会因为一些无关的动态内容(比如时间戳)误判,可以改成对比你关心的特定区域的内容,比如某个div的文本
- 可以给请求加个超时时间,比如
requests.get(url, timeout=10),避免长时间卡住 - 频繁请求可能会被网站封禁,可以在请求里加请求头模拟浏览器,比如
headers={'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36'}
内容的提问来源于stack exchange,提问作者here-to-learn




