Python:如何使用 Selenium 打印所有源代码

Avo*_*yan 1 python selenium selenium-webdriver

driver.page_source不要返回所有的源代码。它只是详细地打印了部分代码,但它遗漏了大部分代码。我怎样才能解决这个问题?

这是我的代码:

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
  def htmlToLuna():
  url ='https://codefights.com/tournaments/Xph7eTJQssbXjDLzP/A'
  driver = webdriver.Chrome('C:\\Python27\\chromedriver\\chromedriver.exe')
  driver.get(url)
  web=open('web.txt','w')
  web.write(driver.page_source)
  print driver.page_source
  web.close()

print htmlToLuna()
Run Code Online (Sandbox Code Playgroud)

VIS*_*VAM 5

这是一个简单的代码,它所做的就是打开url并获取长度页面源并等待五秒钟,然后再次获取页面源的长度。

if __name__=="__main__":
    browser = webdriver.Chrome()
    browser.get("https://codefights.com/tournaments/Xph7eTJQssbXjDLzP/A")
    initial = len(browser.page_source)
    print(initial)
    time.sleep(5)
    new_source = browser.page_source
    print(len(new_source)
Run Code Online (Sandbox Code Playgroud)

查看输出:15722 48800

你看到页面源的长度在等待后增加了吗?在获取源之前,您必须确保页面已完全加载。但这不是一个正确的实现,因为它盲目地等待。

这是一个很好的方法,浏览器将等待直到找到您选择的元素。超时设置为 10 秒。

if __name__=="__main__":
    browser = webdriver.Chrome()
    browser.get("https://codefights.com/tournaments/Xph7eTJQssbXjDLzP/A")
    try:
        WebDriverWait(browser, 10).until(EC.presence_of_element_located((By.CSS_SELECTOR, '.CodeMirror > div:nth-child(1) > textarea:nth-child(1)')))  # 10 seconds delay
        print("Result:")
        print(len(browser.page_source))
    except TimeoutException:
        print("Your exception message here!")
Run Code Online (Sandbox Code Playgroud)

输出:结果:52195

参考:

/sf/answers/1859729441/

http://selenium-python.readthedocs.io/locating-elements.html

坚持,稍等!即使这样也不能保证获得完整的页面源,因为单个元素是动态加载的。如果浏览器找到它继续移动的元素。因此,请确保找到正确的元素以确保页面已完全加载。

PS 我的是 Python3 & webdriver 在我的环境路径中。所以我的代码需要稍微修改一下,使其适用于 Python 2.x 版本。我想只需要修改打印语句。