在前一篇Excel / 使用SeleniumBasic查詢發布到網路的google sheets提到
SeleniumBasic不能將透過模擬鍵盤ctrl+a ctrl+c 將資料貼入Excel
爬文的過程,看到有人建議可以引用Microsoft Forms DataObject的剪貼簿功能
As I said in the comments, Selenium can use SendKeys for this. However, if you should really need the copy-paste action, I suggest using the Clipboard instead.
實際測試時,雖然可以抓到資料並貼回Excel
但是都是純文字的格式
所以一直在測試是不是paste、pastespecial的參數設定問題
例如:有人提到剪貼簿物件要用worksheet物件的方法來貼上
You are using Range.PasteSpecial, which applies to pasting Excel Formatted Range Objects - documentation found here. Unfortunately, what sits on your Clipboard isn't an Excel Range Object, so you need the Worksheet.PasteSpecial method instead.
但是依照這個方式設定.PasteSpecial Format:=”Text”, Link:=False, DisplayAsIcon:= False
還是會產生錯誤
後來在〈Excel VBA 經典程式碼─一行抵萬行「偷懶程式碼」應用大全〉P17-70的範例得知
其實只要有著完整的<table>…</tabe>格式,就能夠將html表格透過剪貼簿貼入Excel裡
所以,透過SeleniumBasic要取得的資料不是文字內容 Text
反而應該是包含完整Html標籤的 outerHtml
在SeleniumBasic取得outerHtml的方式為 .Attribute(“outerHTML”)
.FindElementByCss( ).Attribute("outerHTML")
所以最終的程式碼擷取重要內容如下
在取得網頁目標table資料並透過Attribute(“outerHTML”)取得完整的table標籤內容
將資料傳入MSForms.DataObject
再透過其中的 SetText( )、PutInClipboard( )、GetFromClipboard( )、GetText( )
tt = BOT.FindElementByCss("css選擇器").Attribute("outerHTML") Dim DataObj As MSForms.DataObject '前期繫結 Microsoft Form 2.0 Library Set DataObj = New MSForms.DataObject '宣告 MSForms.DataObject With DataObj .SetText "" '先清空DataObj內容 .SetText tt '設定內容 .PutInClipboard '將資料從DataObj傳入剪貼簿 End With DataObj.GetFromClipboard 'DataObj取得剪貼簿內容 getStr = DataObj.GetText(1) '1表示取得文字格式的資料 ' MsgBox getStr ' DataObj.GetText(1) '如果沒有要輸出訊息的話 可以不用回傳到getStr Sheets(1).Range("A1").Select ActiveSheet.Paste With DataObj '再清空DataObj內容 .SetText "" .PutInClipboard End With
備註:
使用這個方法的缺點是不能同時操作複製功能
不然程式會被干擾,會被同時進行的複製取代內容
DataObject 的運作方式類似剪貼簿。 如果您將文字字串複製到 DataObject, DataObject 會儲存文字字串。 如果您將相同格式的第二個字串複製到 DataObject,則 DataObject 會捨棄第一個文字字串,並儲存第二個字串的副本。 它會儲存指定之格式的一段文字,並保留最近一次作業的文字。
參考資料
Pasting text into Excel using Selenium
VBA Copy to Clipboard, Paste and Clear
Unable to paste special from clipboard
innerHTML、outerHTML、innerText、outerText的區別及相容性問題
〈Excel VBA 經典程式碼─一行抵萬行「偷懶程式碼」應用大全〉,P17-70。
VBA automation can’t get innerText (innerHTML, value)
Selecting inner text when using find element by css selector python, selenium and create a loop