【问题标题】:How to obtain full html with all Shadow DOM elements expanded如何获取扩展所有 Shadow DOM 元素的完整 html
【发布时间】:2019-07-18 23:53:43
【问题描述】:

我被这个卡住了。我正在创建一个应该获取页面 HTML 的网络爬虫。问题是当我到达由 JS 呈现的内容时。为此,我需要使用 Selenium 之类的东西来获取完整的 HTML。

这很好,并且对于使用例如 Angular 创建的页面非常有效。当我们到达用 Polymer 或任何其他带有 Shadow DOM 和 Web 组件的框架编写的页面时,问题就开始了。 在那种情况下,我只能在第一个影子根之前获取内容。 我使用的代码:

driver.execute_script("return document.body.innerHTML")

是的...所以我想构建一个包含所有自定义元素内联的字符串。 我得到的只是:

<some-app page="homepage"></some-app><iron-a11y-announcer></iron-a11y-announcer>

你可以想象这还不够。 所以我知道我可以递归访问所有影子根元素,例如。

document.querySelector("some-app").shadowRoot

我想让它通用。 有任何想法吗?有现成的解决方案吗?

【问题讨论】:

  • 发布网站的url来检查HTML代码
  • 好吧,我不能。这是公司的内部网站。但是这个:shop.polymer-project.org 是一样的

标签: javascript python selenium selenium-webdriver


【解决方案1】:

一个肮脏的解决方案:

def expand_element(element):
    subelements  = element.find_elements_by_xpath("./*")
    tag = element.get_attribute('tagName')
    tags_to_skip= ["TEMPLATE" , "svg" , "g" ,"path" , "STYLE" , "img" , "video" , ]
    if tag in tags_to_skip:
        return
    print(tag)
    self.counter+=1
    if self.counter %100 == 0: 
        print("==================="  ,  self.counter , "==================")

    shadowroot = expand_shadow_element(element)
    if shadowroot:

        subelements  = driver.execute_script('return arguments[0].querySelectorAll("*")', shadowroot)

    for obj in subelements:
        expand_element(obj)    

def expand_shadow_element(element):
    shadow_root = driver.execute_script('return arguments[0].shadowRoot', element)
    return shadow_root

仅适用于 chrome web 驱动程序,我必须连接结果,但这是基本机制....

【讨论】:

    猜你喜欢
    • 2014-11-24
    • 1970-01-01
    • 2018-12-20
    • 2019-11-10
    • 2021-05-15
    • 2021-06-09
    • 2011-07-04
    • 2012-09-09
    • 1970-01-01
    相关资源
    最近更新 更多