如何使用Playwright获取所有span标签内的文本内容?
解决Playwright获取所有span标签文本的问题
你原来的代码里有个明显错误:page.get_by_test_id('//span')用错了——get_by_test_id是专门定位带data-testid属性的元素的,不能直接传XPath表达式。要获取页面所有<span>的文本,用Playwright的locator方法结合批量文本获取接口即可,下面是两种实用实现方式:
方法1:直接批量获取所有span文本(简洁高效)
用all_text_contents()方法直接返回所有匹配元素的文本列表,适合只需要文本内容的场景:
from playwright.sync_api import sync_playwright with sync_playwright() as pw: browser = pw.chromium.launch(headless=False) context = browser.new_context(viewport={"width": 1920, "height": 1080}) page = context.new_page() url = 'https://announcements.bybit.com/en-US/?category=new_crypto&page=6' page.goto(url) # 用页面加载完成等待替代固定超时,更可靠 page.wait_for_load_state("networkidle") # 定位所有span标签,获取全部文本内容 span_texts = page.locator("span").all_text_contents() # 打印非空文本(过滤布局用的空span) for text in span_texts: stripped_text = text.strip() if stripped_text: print(stripped_text) context.close() browser.close()
方法2:遍历每个span元素(支持额外操作)
如果需要对每个span做额外处理(比如获取属性、判断位置),可以先用all()获取元素句柄列表,再逐个操作:
from playwright.sync_api import sync_playwright with sync_playwright() as pw: browser = pw.chromium.launch(headless=False) context = browser.new_context(viewport={"width": 1920, "height": 1080}) page = context.new_page() url = 'https://announcements.bybit.com/en-US/?category=new_crypto&page=6' page.goto(url) page.wait_for_load_state("networkidle") # 获取所有span元素的句柄 span_elements = page.locator("span").all() for element in span_elements: text = element.inner_text().strip() if text: print(text) # 可添加额外操作,比如获取元素class属性 # print(element.get_attribute("class")) context.close() browser.close()
关键注意点
- 定位器选择:可以用CSS选择器
"span"或者XPath"//span",效果完全一致,选你习惯的即可。 - 等待策略:避免用固定的
wait_for_timeout,推荐用wait_for_load_state("networkidle")或等待关键元素加载,防止网络延迟导致获取不到内容。 - 空文本过滤:页面中很多span是用于布局的空标签,用
strip()过滤后输出更实用。
内容的提问来源于stack exchange,提问作者Peter Yoo
相关产品推荐
相关产品推荐

