Python爬取IMDb网站触发SyntaxError语法错误如何解决
报错根因
这个语法错误和IMDb站点本身没有关系,是代码存在两处基础语法问题导致的:
- 所有语句没有正确换行:导入模块、变量赋值、函数调用、注释全挤在同一行,Python解释器无法正确识别语句边界。
- 传参规则错误:Python函数的关键字参数名不允许包含横杠
-,你直接写data-testid='title'时,解释器会把-识别为减法运算符,判定你在表达式里写了赋值操作,直接抛出SyntaxError: expression cannot contain assignment, perhaps you meant "=="?错误。
另外就算你修好语法问题,直接用默认的requests请求IMDb也会被反爬规则拦截,拿不到正常页面内容。
修复方案
- 拆分所有挤在同一行的代码,每个独立语句单独占一行,不要把注释和执行代码写在同一行。
- 给requests请求添加浏览器UA头,模拟真实用户访问,绕过基础反爬校验。注意不要把请求返回值命名为
request,会和导入的requests模块重名引发变量覆盖问题,统一命名为response更规范。 - 查找带横杠的HTML属性时,不要直接作为关键字参数传入
find_all,把属性键值对封装到attrs字典参数中传递。
修复后的可运行代码如下:
import requests import pandas as pd from bs4 import BeautifulSoup # 模拟Chrome浏览器的请求头 headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36" } response = requests.get( 'https://www.imdb.com/what-to-watch/fan-favorites/?ref_=hm_fanfav_sm', headers=headers ) soup = BeautifulSoup(response.content, 'html.parser') # 带特殊字符的属性放到attrs字典中传递 names = soup.find_all('span', attrs={'data-testid': 'title'}) print(names)
补充说明:所有包含横杠、特殊字符的HTML属性(比如
data-*系列自定义属性、aria-*系列无障碍属性),在BeautifulSoup里查找时都要放到attrs字典里传参,只要属性名不符合Python标识符命名规则(不能有横杠、不能数字开头、不能包含特殊符号),就不能直接当关键字参数写,否则一定会触发同类语法错误。
内容的提问来源于stack exchange,提问作者Akshar Sahul
相关产品推荐
相关产品推荐

