You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用单个CSS选择器提取未禁用的HTML按钮文本片段?

解决方案

Selectolax 实现(CSS选择器方式)

正确的CSS选择器需要先排除包含.disabled子元素的按钮,再提取目标div的文本:

from selectolax.parser import HTMLParser
html = """
<button data-v-4e0029d1=""><div data-v-4e0029d1="">Small</div></button>
<button data-v-4e0029d1=""><div data-v-4e0029d1="">Large</div><div class="disabled" data-v-4e0029d1="">disabled</div></button>
"""
parser = HTMLParser(html)
# 正确的CSS选择器:先筛选无.disabled子元素的button,再取其第一个子div
target_elements = parser.css("button:not(:has(div.disabled)) > div:first-child")
for elem in target_elements:
    print(elem.text())  # 输出: Small

之前选择器的问题说明

  • 你之前的选择器错误地将:not(:has())应用在div上,而应该针对button元素筛选——因为.disabled是button的子元素,不是目标div的子元素
  • button:not(:has(div.disabled)) 会精准排除包含禁用标记的按钮,再通过> div:first-child提取按钮内的文本容器

BeautifulSoup4 实现

如果使用bs4,可以通过两种方式实现需求:

方式1:遍历筛选

from bs4 import BeautifulSoup
html = """
<button data-v-4e0029d1=""><div data-v-4e0029d1="">Small</div></button>
<button data-v-4e0029d1=""><div data-v-4e0029d1="">Large</div><div class="disabled" data-v-4e0029d1="">disabled</div></button>
"""
soup = BeautifulSoup(html, "html.parser")
# 遍历所有button,排除包含.disabled类div的按钮
for button in soup.find_all("button"):
    if not button.find("div", class_="disabled"):
        target_div = button.find("div")
        print(target_div.text.strip())  # 输出: Small

方式2:CSS选择器(需bs4 4.7.0+版本,配合lxml解析器)

from bs4 import BeautifulSoup
html = """
<button data-v-4e0029d1=""><div data-v-4e0029d1="">Small</div></button>
<button data-v-4e0029d1=""><div data-v-4e0029d1="">Large</div><div class="disabled" data-v-4e0029d1="">disabled</div></button>
"""
soup = BeautifulSoup(html, "lxml")
target_elements = soup.select("button:not(:has(div.disabled)) > div:first-child")
for elem in target_elements:
    print(elem.text.strip())  # 输出: Small

内容的提问来源于stack exchange,提问作者dimButTries

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 13:55:20