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

