如何用Beautiful Soup提取HTML中JSON脚本的指定字段?
提取Next.js页面title字段的正确方法
你之前用soup.find('a-toaster Toaster_toaster__bTabZ')报错是因为找错了目标元素——这个元素和你要的title数据完全无关,而且这种写法本身也不符合BeautifulSoup的选择器规则(标签加类名需要分开指定)。正确的做法是直接定位页面里的__NEXT_DATA__脚本标签,你要的title就藏在这个标签的JSON数据里。
具体步骤和代码示例:
- 定位目标script标签
用标签名+id属性精准查找,这是最可靠的方式:
script_tag = soup.find('script', id='__NEXT_DATA__')
- 解析JSON数据
把script标签里的文本内容解析成Python字典:
import json if script_tag: next_data = json.loads(script_tag.string) else: # 处理找不到标签的情况,比如页面结构变化 next_data = {}
- 提取title字段
按照JSON层级逐层取值,建议用get方法避免层级不存在时抛出KeyError:
title = next_data.get('props', {}).get('pageProps', {}).get('metadata', {}).get('title', None)
- 存入DataFrame
用pandas创建DataFrame,customer列填充null:
import pandas as pd df = pd.DataFrame({ 'title': [title], 'customer': [None] })
完整示例代码:
from bs4 import BeautifulSoup import json import pandas as pd # 假设你的HTML内容存在html_content变量里 soup = BeautifulSoup(html_content, 'html.parser') # 定位并解析__NEXT_DATA__ script_tag = soup.find('script', id='__NEXT_DATA__') if script_tag: next_data = json.loads(script_tag.string) title = next_data.get('props', {}).get('pageProps', {}).get('metadata', {}).get('title', None) else: title = None # 创建DataFrame df = pd.DataFrame({ 'title': [title], 'customer': [None] }) print(df)
如果遇到某个层级缺失的情况,上面的get方法会返回None,不会导致程序崩溃,你可以根据需求调整默认值。
内容的提问来源于stack exchange,提问作者brenda89
相关产品推荐
相关产品推荐

