我创建了一个脚本,用于填写表单并提交。 然后该网站显示结果。
一旦我使用selenium打开chrome,我得到driver.page_source并且它给出了初始状态的正确html输出。
如果我在提交表单后使用driver.page_source,我只会再次获得初始状态的来源,即:即使html发生了变化,也不会反映出任何变化。
问题:如何在提交表单后获得包含更改的页面的HTML输出?
提前感谢您的帮助! ps:我很新,所以是的..
编辑: 我找到了答案,它一直工作正常,但网页还没有完全加载,因此我仍然得到旧的源代码,所以我只是让驱动程序等待提取新源。 谢谢!
答案 0 :(得分:1)
您可以将Selenium的当前页面传递给scrapy Selector,并使用常用的css和/或xpath选择器从中获取数据:
from tensorflow import logging
coloredlogs.install(level='DEBUG')
tf.logging.set_verbosity(tf.logging.DEBUG)
答案 1 :(得分:1)
在您提取page_source
到检查更改之前提交表单之后,值得一提的是,虽然 WebClient 在某个阶段可能已达到'document.readyState'
等于"complete"
而 Selenium 会恢复对程序执行的控制,但并不能保证所有新页面上关联的 Javascript 和 Ajax Calls 已经完成。除非与 DOM树关联的 Javascript 和 Ajax Calls 完成后,页面才会完全呈现,否则您可能无法跟踪预期的变化。
检查更改的理想方法是将WebDriverWait与expected_conditions子句同时设置为title_contains,如下所示:
driver.find_element_by_xpath("xpath_of_element_changes_page").click()
WebDriverWait(browser, 10).until(EC.title_contains(("full_or_partial_text_of_the_new_page_title")))
source = driver.page_source
注意:当页面标题位于HTML DOM的<head>
标记内时,更好的解决方案是诱导WebDriverWait对于DOM Tree的<body>
标记内所有情况下都会出现的元素的可见性,如下所示:
driver.find_element_by_xpath("xpath_of_element_changes_page").click()
WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.ID, "id_of_element_present_in_all_situation")))
source = driver.page_source