2014-01-22 26 views
2

我使用Python + Selenium + Splinter + Firefox来创建交互式网络爬虫。python中的Firefox + Selenium:如何交互式获取元素html?

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

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

方法我目前使用的是:

右键单击该项目的网站(火狐),点击“检查 元素”,然后单击Firefox的检查,请单击“复制HTML',然后 手动将它提供给脚本,然后该脚本能够继续。

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

我对JavaScript一无所知,但在阅读other questions后,我感觉到javascript实际上可能是解决方案。

分裂允许运行JavaScript,拿起返回值到Python脚本,因此,从理论上讲:

是否可以运行JavaScript代码,将返回的下一个元素的HTML代码的用户点击?所以命名为方法只会右键单击所需的元素?


澄清了Amey的评论:

的Python脚本打开Firefox窗口,其控制仍然从脚本保留。 与分裂,JavaScript代码可以执行并等待完成/信息返回。 这意味着python脚本可以要求用户单击或右键单击它拥有的Firefox窗口,因此目标是启动一个JavaScript,以“捕捉”用户点击哪个元素。

是否足以让javascript捕捉到所需的元素?

+1

Javascript仍然需要一种方法来查找“下一个需要的元素”,以返回您可以在Selenium中使用的标识符。根据我对你的问题的理解,你可以检索一个页面的全部HTML(使用JS或者Selenium),并且使用一些HTML解析器解析它,并且抓取你需要的东西。 – Amey

+0

感谢您的回答。我扩大了描述,因为我不太清楚情况是否清楚。如果我检索了整个HTML并解析了结果代码,我就无法做到我想要的:捕捉用户点击某个元素并直接使用该代码,而无需通过ID,名称,css专门搜索它,等 –

+0

这看起来很相似,但在不同的上下文中使用:http://stackoverflow.com/questions/17157342/pure-js-detect-if-im-clicking-an-element-within-an-element是那短的解决方案我应该适应我的代码? –

回答

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') 
+0

令人惊叹!经过测试和工作,正好解决了这个问题!我的意图是将它用于网站中的任何项目,以便稍后能够再现这些操作(我做了一次操作,刮板自动创建=)所以我需要匹配文档中的所有项目,但是这种适应与创建您刚分享的脚本相比,这将是一个笑话。谢谢! –

+0

我编辑了您提供的脚本以包含文档中的所有元素,但未能点击其中的一些元素。你能给我一个关于发生的事情的指针吗?它在这里:http://stackoverflow.com/questions/21316003/how-to-capture-any-element-where-the-user-clicked-with-javascript –