You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动