我正在使用 Python + Selenium + Splinter + Firefox 创建交互式网络爬虫。
python 脚本提供选项,然后 Selenium 打开 Firefox 并发送一些命令。
现在,我需要让 python 脚本知道用户想要与之交互的 Web 元素。
我目前使用的方法是:
Right-click the item in the website (Firefox), click 'inspect element', then click in the Firefox inspector, click 'copy HTML', then feed it manually to the script, which will then be able to go on.
但出于显而易见的原因,我觉得这个过程远非完美。
我对javascript一无所知,但在阅读other questions之后我觉得 JavaScript 实际上可能是解决方案。
Splinter 允许运行 javascript 并将返回值提取到 python 脚本中,因此,理论上:
是否可以运行一个 javascript 代码来返回用户点击的下一个元素的 html 代码?那么命名的方法只会右键单击所需的元素吗?
Amey 评论的澄清:
python 脚本打开一个 Firefox 窗口,该窗口的控制权仍然保留在脚本中。 并且使用 splinter,可以执行 javascript 代码并等待完成/信息返回。 这意味着 python 脚本可以要求用户在它拥有的 Firefox 窗口中单击或右键单击,因此目标是启动一个 javascript 来“捕获”用户单击的元素。
这足以让 javascript 捕获所需的元素吗?
请您参考如下方法:
这是一个有趣的问题。我的策略是使用 Javascript 将监听器添加到您定位的元素。由于您没有指定元素的类型,因此我使用了链接。不过,这很容易适应。
当一个元素被点击时,监听器会创建一个新的页面元素,并使用您指定的 ID 并将 value 属性设置为相关信息。
然后,假设您已经设置了 driver.implicitly_wait,您可以等待元素出现。
driver.execute_script("for(var i = 0; i < document.links.length; i++){document.links[i].onclick = function clicked(){var e = document.createElement('a'); e.setAttribute('id','myUniqueID'); e.setAttribute('value', this); document.getElementsByTagName('body')[0].appendChild(e);};}")
clicked = driver.find_element_by_id('myUniqueID').get_attribute('value')
