4

我已经成功地在 python 中使用 Playwright 从页面中获取元素。我现在遇到了从嵌入iframe的文档中获取元素的挑战。例如,我使用w3schools 页面来解释<option>element,它在 iframe 中显示结果。我正在尝试<option>从 iframe 中检索此元素的句柄。

在页面上获取 an 元素的“正常”方式page.querySelector()无法获取 an elementHandle,这只是打印<class 'NoneType'>

with sync_playwright() as p:
    for browser_type in [p.chromium, p.firefox, p.webkit]:
        browser = browser_type.launch(headless=False)
        page = browser.newPage()
        page.goto('https://www.w3schools.com/tags/tryit.asp?filename=tryhtml_option')
        element = page.querySelector('select')
        print(type(element))
        browser.close()

我首先尝试显式获取 iframe 的句柄,但这会产生相同的结果(<class 'NoneType'>):

with sync_playwright() as p:
    for browser_type in [p.chromium, p.firefox, p.webkit]:
        browser = browser_type.launch(headless=False)
        page = browser.newPage()
        page.goto('https://www.w3schools.com/tags/tryit.asp?filename=tryhtml_option')      
        iframe = page.querySelector('iframe')
        element = iframe.querySelector('select')
        print(type(element))
        browser.close()

如何从 iframe 中获取内容?

4

2 回答 2

4

原来我很接近,但要正确获取 iframe,我需要调用该contentFrame()方法。

返回引用 iframe 节点的元素句柄的内容框架,null否则

然后,querySelector()将返回各自elementHandle就好了:

with sync_playwright() as p:
    for browser_type in [p.chromium, p.firefox, p.webkit]:
        browser = browser_type.launch(headless=False)
        page = browser.newPage()
        page.goto('https://www.w3schools.com/tags/tryit.asp?filename=tryhtml_option')
        iframe = page.querySelector('iframe').contentFrame()
        element = iframe.querySelector('select')
        print(type(element))
        print(element.innerHTML())
        browser.close()

成功打印

<class 'playwright.sync_api.ElementHandle'>

  <option value="volvo">Volvo</option>
  <option value="saab">Saab</option>
  <option value="opel">Opel</option>
  <option value="audi">Audi</option>

注意:如果有多个 iframe,您可以在检索句柄时只使用一个属性。要在上面的示例中通过其获取 iframe id,例如使用

iframe = page.querySelector('iframe[id=\"iframeResult\"]').contentFrame()
于 2020-12-23T12:27:37.867 回答
3

querySelector将返回一个ElementHandle. 在这种情况下,它将是iFrame但作为页面元素。如果你想frame从你需要调用的那个元素中获取contentFrame,然后从那里处理那个框架。

iframe = page.querySelector('#iframeResult').contentFrame()
element = iframe.querySelector('select')
print(type(element))
于 2020-12-23T12:28:37.123 回答