如何用BeautifulSoup提取script标签内filmData的电影名与上映年份
解决方法
你可以通过以下两种常用方式提取对应字段:
方法1:正则表达式匹配(实现简单,适合固定结构的内容)
直接通过正则匹配name和releaseYear对应的值,完整可运行代码如下:
import requests import re from bs4 import BeautifulSoup url = 'https://letterboxd.com/film/dogville/' req = requests.get(url) soup = BeautifulSoup(req.content, 'html.parser') # 提取script标签的纯文本内容 script_content = soup.find_all("script")[10].text # 匹配name字段值 name = re.search(r'name:\s*"([^"]+)"', script_content).group(1) # 匹配releaseYear字段值 release_year = re.search(r'releaseYear:\s*"([^"]+)"', script_content).group(1) print(f"电影名称:{name}") print(f"上映年份:{release_year}")
方法2:JS对象转JSON解析(结构更稳定,适合多字段提取场景)
先提取filmData对应的对象字符串,将不符合JSON规范的部分替换后用json模块解析为Python字典,后续可以直接取任意字段:
import requests import re import json from bs4 import BeautifulSoup url = 'https://letterboxd.com/film/dogville/' req = requests.get(url) soup = BeautifulSoup(req.content, 'html.parser') script_content = soup.find_all("script")[10].text # 提取filmData赋值语句中等于号后、分号前的对象内容 film_data_str = re.search(r'var filmData = (.*?);', script_content).group(1) # 给JS对象的所有键添加双引号,转为合法JSON格式 film_data_str = re.sub(r'(\w+):', r'"\1":', film_data_str) # 转为Python字典 film_data = json.loads(film_data_str) name = film_data['name'] release_year = film_data['releaseYear'] print(f"电影名称:{name}") print(f"上映年份:{release_year}")
两种方法运行后输出结果一致:
电影名称:Dogville 上映年份:2003
内容的提问来源于stack exchange,提问作者user15107381
相关产品推荐
相关产品推荐

