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

Python中if无执行语句搭配else引发语法错误及爬虫代码求助

解决网页爬虫的语法错误问题

首先看你给出的代码片段,能发现几个明显的语法问题,我来一步步帮你排查修复:

1. 代码缩进与换行问题

Python是强制缩进的语言,你把py_newsdate、py_newstitle和if判断都挤在for循环的同一行,这会直接触发语法错误。正确的写法应该是每个语句单独一行,并且保持一致的缩进(通常用4个空格):

for i in web_results:
    # 提取日期并转换为datetime对象
    py_newsdate = datetime.strptime(i.find('div', attrs={'class': "infoItem"}).find_all('p')[0].getText()[6:], '%d/%m/%Y')
    # 提取帖子标题
    py_newstitle = i.find('h3').find('a')['title']
    # 补全完整的条件判断逻辑
    if py_newsdate >= sql_stored_date and py_newstitle != sql_stored_title:
        # 这里写你需要执行的操作,比如插入数据库、发送通知等
        print(f"处理新帖子:{py_newstitle}")

2. 不完整的if条件

你的代码里if (py_newsdate < sql_...是截断状态,不仅条件没写完,还可能存在括号使用不当的问题。如果是要判断帖子日期≥数据库存储日期且标题不同,条件应该写成py_newsdate >= sql_stored_date and py_newstitle != sql_stored_title,逻辑运算符的优先级足够清晰,不需要额外加括号(如果要加也要保证括号成对)。

3. 额外的潜在问题(非语法但易报错)

除了语法问题,还有几个点能帮你避免后续运行时错误:

  • 确保已导入datetime模块:在代码开头加上import datetime,否则datetime.strptime会报NameError。
  • 网页元素提取可能失败:比如i.find('div', attrs={'class': "infoItem"})可能返回None,后续调用.find_all('p')会直接报错,建议加安全判断:
    info_div = i.find('div', attrs={'class': "infoItem"})
    if not info_div:
        continue  # 找不到日期容器,跳过当前帖子
    date_p_list = info_div.find_all('p')
    if len(date_p_list) == 0:
        continue
    

完整的修正示例

import datetime
# 假设你已经从数据库获取到存储的日期和标题
sql_stored_date = datetime.datetime(2024, 5, 1)  # 示例日期
sql_stored_title = "旧帖子标题"

for i in web_results:
    # 安全提取日期
    info_div = i.find('div', attrs={'class': "infoItem"})
    if not info_div:
        continue
    date_p_list = info_div.find_all('p')
    if len(date_p_list) == 0:
        continue
    date_text = date_p_list[0].getText()[6:]
    try:
        py_newsdate = datetime.strptime(date_text, '%d/%m/%Y')
    except ValueError:
        print(f"日期格式解析失败:{date_text}")
        continue
    
    # 安全提取标题
    news_h3 = i.find('h3')
    if not news_h3:
        continue
    news_a = news_h3.find('a')
    if not news_a or 'title' not in news_a.attrs:
        continue
    py_newstitle = news_a['title']
    
    # 条件判断并执行操作
    if py_newsdate >= sql_stored_date and py_newstitle != sql_stored_title:
        # 这里替换成你的实际操作
        print(f"发现新帖子:{py_newstitle},发布日期:{py_newsdate}")

内容的提问来源于stack exchange,提问作者Henrique Muzzi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 03:53:07