2014-01-22 32 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 –