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

如何用纯Playwright代码改写获取a标签href的代码并解决迭代错误

修复Playwright获取多个元素href属性的错误

你的代码报错是因为Playwright的Locator对象不是可迭代对象,不能直接用for循环遍历。page.locator()返回的是一个懒加载的查询定位器,需要调用all()方法将其转换为可迭代的元素句柄列表。

修复后的基础版代码

from playwright.sync_api import sync_playwright

with sync_playwright() as p:
    browser = p.chromium.launch(channel='chrome', headless=True)
    page = browser.new_page()
    url = "https://learningenglish.voanews.com/z/1581"
    page.goto(url, wait_until="networkidle")
    # 调用all()方法获取所有匹配的元素句柄列表
    elements = page.locator('//div[@class="media-block__content"]//a').all()
    for e in elements:
        print(e.get_attribute('href'))

更高效的批量获取写法

可以直接通过浏览器上下文执行JS一次性获取所有href属性,减少元素句柄的创建开销:

from playwright.sync_api import sync_playwright

with sync_playwright() as p:
    browser = p.chromium.launch(channel='chrome', headless=True)
    page = browser.new_page()
    url = "https://learningenglish.voanews.com/z/1581"
    page.goto(url, wait_until="networkidle")
    # 一次性提取所有匹配元素的href属性
    hrefs = page.eval_on_selector_all(
        '//div[@class="media-block__content"]//a',
        'elements => elements.map(el => el.href)'
    )
    for href in hrefs:
        print(href)

补充说明

  • Locator.all():会等待所有匹配元素加载完成,返回元素句柄列表,适合需要对每个元素执行额外操作的场景。
  • eval_on_selector_all:直接在浏览器端执行JS逻辑批量提取属性,性能更优,适合仅需批量获取属性的场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 14:57:28