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

如何用Python+BS4+Selenium定位含随机数字ID的HTML节点?

精准定位带随机ember ID的section节点方案

方法1:结合class属性组合定位

目标节点的class属性artdeco-card ember-view pv-top-card大概率是用户资料顶部卡片的专属组合,直接用这个class组合定位比依赖随机ID更可靠:

Selenium 实现

from selenium import webdriver
from selenium.webdriver.common.by import By

driver = webdriver.Chrome()
# 假设已打开目标用户页面
target_section = driver.find_element(By.CSS_SELECTOR, "section.artdeco-card.ember-view.pv-top-card")

BS4 实现

from bs4 import BeautifulSoup

# 假设html是已获取的页面源码
soup = BeautifulSoup(html, "html.parser")
target_section = soup.find("section", class_="artdeco-card ember-view pv-top-card")

方法2:CSS选择器匹配ID前缀+特征元素过滤

如果class组合不唯一,用CSS选择器的^=语法匹配ID以ember开头的节点,再通过节点内的专属特征元素(比如用户名称、头像容器)过滤:

Selenium 实现

# 获取所有ID以ember开头的section
ember_sections = driver.find_elements(By.CSS_SELECTOR, "section[id^='ember']")
# 过滤出包含用户名称的目标节点
for section in ember_sections:
    try:
        section.find_element(By.CSS_SELECTOR, "h1.text-heading-xlarge")
        target_section = section
        break
    except:
        continue

BS4 实现

# 获取所有ID以ember开头的section
ember_sections = soup.find_all("section", id=lambda x: x and x.startswith("ember"))
# 过滤出包含用户名称的目标节点
for section in ember_sections:
    if section.find("h1", class_="text-heading-xlarge"):
        target_section = section
        break

方法3:基于页面结构上下文定位

如果前两种方法失效,可通过目标节点的父容器层级关系缩小范围,比如用户资料卡片通常在页面主内容容器内:

Selenium 实现

# 假设目标section在主内容容器下
target_section = driver.find_element(By.CSS_SELECTOR, "#main-content section.artdeco-card")

BS4 实现

main_content = soup.find(id="main-content")
target_section = main_content.find("section", class_="artdeco-card")

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 06:45:32