【问题标题】:Firefox + Selenium in python: How to interactively get an element html?python中的Firefox + Selenium:如何以交互方式获取元素html?
【发布时间】:2014-01-22 22:26:50
【问题描述】:

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

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

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

我目前使用的方法是:

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

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

我对javascript一无所知,但是在阅读other questions之后,我觉得javascript实际上可以成为解决方案。

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

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


澄清艾米的评论:

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

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

【问题讨论】:

  • Javascript 仍然需要一种方法来定位“下一个所需元素”,​​以返回您可以与 Selenium 一起使用的标识符。根据我对您问题的理解,您可以检索页面的整个 HTML(使用 JS 或 Selenium),并使用一些 HTML 解析器对其进行解析,然后抓取您需要的内容。
  • 感谢您的回答。我扩展了描述,因为我不太确定情况是否清楚。如果我检索整个 HTML 并解析生成的代码,我将无法做我想做的事:捕捉用户点击一个元素并直接使用该代码,而无需通过 ID、名称、css 专门搜索它,等
  • 这看起来很相似,但在不同的上下文中使用:stackoverflow.com/questions/17157342/… 这是我应该适应我的代码的解决方案的不足吗?
  • 我确实看到了您想要实现的目标,但我不明白为什么。作为一个网络爬虫,我会想象最少的用户交互。但我相信你有你的理由。考虑到这一点,我个人认为没有比您提供的链接更好的方法了。基本上是一个点击监听器,然后是一个点击处理程序来返回所需的输出。

标签: javascript python selenium splinter


【解决方案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')

【讨论】:

  • 太棒了!经过测试和工作,完全解决了问题!我的意图是将它用于网站中的任何项目,以便以后能够重现这些操作(我做了一次,刮板是自动创建的=)所以我需要匹配文档中的所有项目,但是那个适应与创建您刚刚共享的脚本相比,这将是一个笑话。谢谢!
  • 我编辑了您提供的脚本以包含文档中的所有元素,但无法点击其中的一些元素。你能给我指点一下正在发生的事情吗?它在这里:stackoverflow.com/questions/21316003/…
猜你喜欢
  • 1970-01-01
  • 2020-03-08
  • 2021-12-16
  • 2019-07-21
  • 2019-04-10
  • 1970-01-01
  • 2022-07-01
  • 1970-01-01
  • 2020-11-17
相关资源
最近更新 更多