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

如何在Scrapy+Playwright中等待script元素包含指定字符串?

解决方法

以下几种方案可以解决你遇到的script多文本节点导致等待超时的问题:

1. 修正XPath表达式,使用.代替text()

contains(text(), "WKM03Vff")只会检查script元素的第一个文本节点,而contains(., "WKM03Vff")会匹配整个元素的拼接文本内容(所有文本节点合并后的结果),这是最直接的修复方式,Scrapy和Playwright都支持这种标准XPath语法:

# 在你的Scrapy Playwright爬虫中,替换原等待逻辑
await page.wait_for_selector('xpath=//script[contains(., "WKM03Vff")]', timeout=30000)

2. 使用Playwright的wait_for_function自定义检查逻辑

如果XPath的方式仍有问题,可以直接在浏览器上下文里编写JS逻辑,遍历所有script元素并检查文本内容:

await page.wait_for_function(
    # 遍历所有script,判断是否有文本包含目标字符串
    'document.querySelectorAll("script").some(script => script.textContent.includes("WKM03Vff"))',
    timeout=30000  # 可根据页面加载速度调整超时时间
)

3. 针对特定script元素等待文本更新

如果目标字符串所在的script有明确标识(比如id、src属性),可以先定位到该元素,再等待其文本内容满足条件,精度更高:

# 先定位到目标script元素(示例用src属性筛选)
target_script = await page.wait_for_selector('script[src="/static/js/main.chunk.js"]')
# 等待该元素的文本内容包含目标字符串
await page.wait_for_function(
    '(el) => el.textContent.includes("WKM03Vff")',
    target_script,
    timeout=30000
)

为什么之前的方法失效?

  • contains(text(), "xxx"):XPath的text()返回元素的所有文本节点集合,contains()只会匹配集合中的第一个节点,后续节点的内容会被忽略。
  • XPath 2.0的string-join:Scrapy依赖的libxml2引擎仅支持XPath 1.0,不兼容XPath 2.0语法。
  • CSS的:has-text():部分浏览器对该伪类的支持存在局限性,且动态加载的script文本可能无法被正确检测。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 07:35:02