python 中的 Selenium driver.page_source 和 driver.execute_script('return document.documentElement.outerHTML') 有什么区别?

What is the difference between driver.page_source and driver.execute_script('return document.documentElement.outerHTML') in Selenium in python?

我正在分析别人写的脚本。这是它的一个片段:

    def chromedriver():
        options = webdriver.ChromeOptions()
        driver = webdriver.Chrome(options=options)
        driver.implicitly_wait(5)
        driver.maximize_window()
        return driver
    
    def pre_scraping(driver, alpha,beta):
        soup = BeautifulSoup(driver.execute_script('return document.documentElement.outerHTML'), 'html.parser')
        deck =  soup.find('div', {'id':'mainSummary'})
        cards = deck.find_all('div', {'class' : 'cp-tile'})[alpha:beta]

不是在 driver.page_source 的帮助下获取当前页面的源,而是在 driver.execute_script('return document.documentElement.outerHTML' 的帮助下获取外部 HTML(包含标签) ).我在 Whosebug 上找到的条目表明,对于内容变化很快的网站,最好使用 driver.execute_script 而不是 driver.page_source。 driver.execute_script 可以作为刷新特定页面内容的快捷方式吗? driver.page_source 和 driver.execute_script 在这种情况下有什么区别?我添加两个与问题相关的链接:

How to check if a web page's content has been changed using Selenium's webdriver with Python?

Get Page Source

根据规范:

The Get Page Source command returns a string serialization of the DOM of the current browsing context active document.

所以driver.page_source gets the source of the last loaded page. If the page has been modified after loading (for example, by JavaScript or AJAX) 不能保证返回的文本就是修改页面的文本。返回的文本是反映页面的当前状态还是网络服务器最后发送的文本,仍然存在一些歧义。返回的页面源是底层 DOM 的表示,我们不应该期望它以与从 Web 服务器发送的响应相同的方式进行格式化或转义。


Element.outerHTML

元素的 outerHTML 属性获取描述元素(包括其后代)的序列化 HTML 片段。它还可以设置为用从给定字符串解析的节点替换元素。但是,理想情况下,要仅获得元素内容的 HTML 表示,您需要使用 innerHTML 属性 代替。因此读取 outerHTML returns 的值 DOM 包含元素及其后代的 HTML 序列化的字符串。设置 outerHTML 的值会将元素及其所有后代替换为通过解析指定的 htmlString 构建的新 DOM 树。


结论

总结一下从driver.page_source获得的页面源代码在哪里或多或少是艺术家对DOM Tree的印象Element.outerHTML 获取描述元素(包括其后代)的序列化 HTML 片段。