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

如何为动态变化的网页元素编写稳定CSS/XPath选择器

动态类名场景下的稳定定位方案

你遇到的类名动态变更是前端工程化打包时生成CSS哈希类名的典型特征,这类随机拼接的类名每次站点发版都会变化,不要直接使用完整类名做定位,按稳定性从高到低选择以下方案即可:

方案1:优先使用固定data-testid属性定位(最稳定)

你贴出的DOM结构里目标a标签自带data-testid="Link"属性,这个属性是前端开发专门预留的测试定位锚点,业务迭代中几乎不会修改,稳定性最高。

from bs4 import BeautifulSoup

html = '''      <a data-testid="Link" class="sc-pciXn eUevWj JobTile___StyledJobLink-sc- 
                 1nulpkp-0 gkKKqP JobTile___StyledJobLink-sc-1nulpkp-0 gkKKqP" 
                  href="https://join.com/companies/talpasolutions/4978529-project-customer- 
                   success-manager-heavy-industries-d-f-m">'''

soup = BeautifulSoup(html, "lxml")
# 直接通过data-testid属性匹配目标a标签
jobs = soup.find_all("a", attrs={"data-testid": "Link"})
for job in jobs:
    job_url = job.get("href")

方案2:匹配href固定路径前缀(次稳定)

从你给出的href样例看,所有职位链接都以固定业务路径https://join.com/companies/开头,这个路由规则属于站点核心业务逻辑,不会随意变更,既可以做定位规则,也能顺手过滤掉非职位的无关链接。

# 匹配href以指定前缀开头的a标签
jobs = soup.find_all(
    "a",
    href=lambda value: value and value.startswith("https://join.com/companies/")
)
for job in jobs:
    job_url = job.get("href")

方案3:匹配class名中固定的业务前缀(备用)

如果前两个属性后续有调整,你可以观察到class值里JobTile___StyledJobLink是组件名对应的固定前缀,只有后面拼接的哈希字符串会动态变化,可以用正则匹配class的固定部分,不要匹配完整class值。

import re
# 正则匹配class中包含固定JobTile___StyledJobLink前缀的a标签
jobs = soup.find_all("a", class_=re.compile(r"JobTile___StyledJobLink"))
for job in jobs:
    job_url = job.get("href")

注意:不要使用sc-pciXn、eUevWj、gkKKqP这类无意义随机字符串做定位依据,这类值是打包工具自动生成的哈希,每次项目构建都会重新生成。

  • 保险起见可以组合多个规则做过滤,比如同时匹配data-testid="Link"和href前缀,能进一步降低定位失效概率:
jobs = soup.find_all(
    "a",
    attrs={"data-testid": "Link"},
    href=lambda value: value and value.startswith("https://join.com/companies/")
)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 13:48:19