2

我使用 Python + Selenium + Splinter + Firefox 创建交互式网络爬虫。

python 脚本提供选项,然后 Selenium 打开 Firefox 并发送一些命令。

现在,我需要让 python 脚本知道用户想要与之交互的 web 元素。

我目前使用的方法是:

右键单击网站 (Firefox) 中的项目,单击“检查元素”,然后单击 Firefox 检查器,单击“复制 HTML”,然后手动将其提供给脚本,然后脚本就可以继续了。

但由于显而易见的原因,我觉得这个过程远非完美。

我对javascript一无所知,但在阅读了其他问题后,我觉得javascript实际上可以成为解决方案。

Splinter 允许运行 javascript 并将返回值提取到 python 脚本中,因此,理论上:

是否可以运行一个 javascript 代码来返回用户单击的下一个元素的 html 代码?那么命名方法只会右键单击所需的元素吗?


澄清艾米的评论:

python 脚本会打开一个 Firefox 窗口,该窗口仍保留在脚本中。使用 splinter,可以执行 javascript 代码并在完成/信息返回时等待。这意味着 python 脚本可以要求用户单击或右键单击它拥有的 Firefox 窗口,因此目标是启动一个 javascript 来“捕捉”用户单击的元素。

这足以让 javascript 捕获所需的元素吗?

4

1 回答 1

1

这是一个有趣的问题。我的策略是使用 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')
于 2014-01-23T00:16:21.920 回答