【问题标题】:Selenium: How to extract new HTML snippet generated by user interaction?Selenium:如何提取用户交互生成的新 HTML 片段?
【发布时间】:2017-09-05 04:03:29
【问题描述】:

背景

我正在编写一个脚本,以使用 Python 和 Selenium 为一组网站自动提交 Web 表单。但是,该脚本需要在事先未知表单的底层 HTML 和一般结构的类似网站上运行。

我已经设法让标准输入字段(例如文本字段、单选按钮等)很好地工作,但是我在处理日期选择器字段时遇到了困难,因为这些字段是非常特定于站点的。

尽管存在这些特定于站点的差异,但似乎有一种常见的使用模式:(i) 单击日期选择器字段以显示日历弹出窗口;然后 (ii) 点击所需日期。

通过单击日期选择器字段来显示弹出日历非常简单,并且会导致在页面源中的某处插入新的 HTML sn-p(定义日历)。如果我可以只提取这个新的 HTML sn-p,那么我可以使用这些信息来推断输入字段是一个日历以及如何与之交互。

问题

如何提取由用户交互(例如单击输入字段)生成的新 HTML 代码?

【问题讨论】:

  • 请阅读How to Ask。请提供您尝试过的代码和执行结果,包括任何错误消息等。同时提供指向页面和/或相关 HTML 的链接。

标签: python html selenium web-scraping calendar


【解决方案1】:

根据用户反馈编辑回复

获取元素的html内容

如何使用 python / selenium 获取和打印WebElement 实例内容:

my_web_element.get_attribute('innerHTML')
# Or, depending what you want
my_web_element.get_attribute('outerHTML')

如何等待一个元素

在此示例中,我单击 id 为 'target' 的链接并等待 id 为 'calendar' 的元素可见。

driver.find_element_by_id('target').click()
calendar = WebDriverWait(driver, 30).until(
    ec.visibility_of_element_located((By.ID, 'calendar'))
)

结论

from selenium import webdriver
from selenium.webdriver.support.ui  import WebDriverWait
import selenium.webdriver.support.expected_conditions as ec
from selenium.webdriver.common.by import By

driver = webdriver.Chrome()

driver.get('http://spam.egg.bacon')

driver.find_element_by_id('target').click()
calendar = WebDriverWait(driver, 30).until(
    ec.visibility_of_element_located((By.ID, 'calendar'))
)

print calendar.get_attribute('innerHTML')

打印:<div id="calendar">I'm a calendar</div> 完整示例:https://gist.github.com/arount/285e5add758bb14074efc4708f1d6b07

【讨论】:

  • 是的,如果我在操作后获取页面源,则注入的 HTML 是可见的。但是,我只能获取整个页面源代码,这需要在源代码前后进行“差异”以提取注入的代码。有没有办法直接提取新注入的 HTML 而无需进行前后差异?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-29
  • 1970-01-01
  • 1970-01-01
  • 2023-03-09
  • 1970-01-01
相关资源
最近更新 更多