如何用Python BeautifulSoup4从标签列表构建属性值列表(找回代码)
解决Finviz筛选器页面提取option value属性的问题
我之前爬Finviz筛选器的时候也踩过一模一样的坑!你这里的核心问题是把HTML属性和HTML标签搞混了——find_all('value')是在找名为<value>的标签(这种标签根本不存在),而你实际需要的是<option>标签里的value属性,这完全是两回事。
错误原因拆解
你之前的写法f.find_all('value')会返回空列表,因为BeautifulSoup的find_all()方法的第一个参数是标签名称,它会在DOM里搜索<value>标签,但你的目标是<option>标签的value属性,所以这个写法从根上就错了。
正确实现代码
结合你提到的requests、BeautifulSoup4工具,下面是可以直接运行的完整代码,完全符合你要的嵌套列表输出格式:
import requests from bs4 import BeautifulSoup # 处理Finviz反爬,添加请求头 headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36' } # 获取Finviz筛选器页面 url = "https://finviz.com/screener.ashx" response = requests.get(url, headers=headers) soup = BeautifulSoup(response.text, 'html.parser') # 定位所有带data-filter属性的select标签 select_elements = soup.find_all('select', attrs={'data-filter': True}) # 生成嵌套列表:每个子列表对应一个select下的所有option的value值 option_values_nested = [] for select in select_elements: # 找到当前select下的所有option子标签 all_options = select.find_all('option') # 提取每个option的value属性,无属性时默认空字符串(兼容无value的默认选项) current_values = [opt.get('value', '') for opt in all_options] option_values_nested.append(current_values) # 验证输出格式(比如交易所筛选的子列表会是['', 'amex', 'nyse', 'nasd']) print(option_values_nested)
关键细节说明
- 安全提取属性:用
opt.get('value', '')代替直接opt['value'],因为有些<option>标签(比如默认的"请选择"选项)可能没有value属性,直接取会抛出KeyError,get()方法可以指定默认值避免报错。 - 精准定位select:
soup.find_all('select', attrs={'data-filter': True})确保只拿到你需要的带data-filter属性的select标签,不会混入页面其他无关的select。 - 反爬处理:Finviz会拦截无请求头的爬虫,所以必须添加
User-Agent模拟浏览器请求。
期望输出示例
运行后你会得到完全符合要求的嵌套列表,比如其中几个子列表会是:
[ ['', 'faang', 'mega_cap', 'large_cap', ...], # 市值筛选 ['', 'amex', 'nyse', 'nasd'], # 交易所筛选 ['', 'sector_consumer', 'sector_tech', ...] # 行业筛选 ]
内容的提问来源于stack exchange,提问作者Luck Box
相关产品推荐
相关产品推荐

