如何使用Playwright选择嵌套HTML元素并提取动态随机ID下的目标文本列表
修正后可直接运行的代码(适配Playwright定位逻辑)
# 先定位到外层ufi开头的父容器 ufi_container = page2.query_selector(f'xpath=//div[starts-with(@id, "ufi_")]') target_texts = [] if ufi_container: # 精准匹配每个动态id文章容器下的第二个子div(目标文本所在位置) comment_nodes = ufi_container.query_selector_all('div >> div:nth-child(2)') for node in comment_nodes: text = node.text_content().strip() if text: target_texts.append(text) print(target_texts)
原代码出错核心原因
- 你写的
div>>//div[1]会匹配所有后代层级的第一个div,和你要的目标元素完全错位 - 硬靠
div[5]按索引定位稳定性极差,只要前端新增任意空div结构就会失效
优化点说明
- 用
starts-with(@id, "ufi_")不需要提前拼接动态page_id,只要id前缀固定就能匹配,完美适配动态id场景 - 直接用
nth-child(2)精准命中每个文章div下的第二个子元素,不会乱匹配其他层级的div - 新增
strip()过滤空白字符,避免拿到多余的换行、空格
可选纯xpath写法(效果一致)
如果article_id有固定前缀可以用这个写法,没有前缀的话删掉[starts-with(@id,"article_")]即可:
target_nodes = page2.query_selector_all(f'xpath=//div[starts-with(@id,"ufi_{page_id}")]//div[starts-with(@id,"article_")]/div[2]') target_texts = [node.text_content().strip() for node in target_nodes if node.text_content().strip()]
内容的提问来源于stack exchange,提问作者Huang Kuan Wei
相关产品推荐
相关产品推荐

