Html 谷歌如何将法语翻译成英语?

Html 谷歌如何将法语翻译成英语?,html,excel,vba,web-scraping,Html,Excel,Vba,Web Scraping,使用谷歌翻译,法语到英语在使用下面的代码时不会返回正确的值 如果我手动使用谷歌翻译应用程序,我会得到正确的翻译 比如, 从“salle de lémetteur”代码中,返回“董事室”。 在谷歌翻译应用程序中,正确返回“发射机室” 如果我检查谷歌翻译应用程序中的元素,我会在 span class="tlid-translation translation" lang = "en" 我不知道如何从“span title class”获取此“innerte

使用谷歌翻译,法语到英语在使用下面的代码时不会返回正确的值

如果我手动使用谷歌翻译应用程序,我会得到正确的翻译

比如,
从“salle de lémetteur”代码中,返回“董事室”。
在谷歌翻译应用程序中,正确返回“发射机室”

如果我检查谷歌翻译应用程序中的元素,我会在

span class="tlid-translation translation" lang = "en" 
我不知道如何从“span title class”获取此“innertext”

有没有办法从你那里得到译文

span class="tlid-translation translation" lang = "en"' 
而不是

objDivs = objHTML.getElementsByTagName("div"), objDiv.className = "t0"
将公共函数转换为字符串(strInput作为字符串,strSourceLng作为字符串,strTargetLng作为字符串)
暗弦
作为对象的Dim objHTTP
作为对象的Dim objHTML
作为对象的Dim objDivs
作为对象的Dim objDiv
翻译成字符串的Dim strt
'将查询发送到网页
strURL=”https://translate.google.com/m?hl=“&strSourceLng&_
“&sl=“&strSourceLng&_
“&tl=“&strTargetLng&_
“&ie=UTF-8&prev=_m&q=”&strInput
设置objHTTP=CreateObject(“MSXML2.ServerXMLHTTP”)的后期绑定
objHTTP.Open“GET”,strURL,False
objHTTP.setRequestHeader“用户代理”、“Mozilla/4.0(兼容;MSIE 6.0;Windows NT 5.0)”
objHTTP.send“”
'创建html文档
设置objHTML=CreateObject(“htmlfile”)
使用objHTML
打开
.Write objHTTP.responseText
.结束
以
设置objDivs=objHTML.getElementsByTagName(“div”)
对于objDiv中的每个objDiv
如果objDiv.className=“t0”,则
strTranslated=objDiv.innerText
如果标准翻译为“”,则
翻译=标准翻译
如果结束
如果结束
下一个objDiv
设置objHTML=Nothing
设置objHTTP=Nothing
端函数

如果使用早期绑定的html文档,即MSHTML.HTMLDocument,则可以访问querySelector,并可以尝试使用css选择器以该元素为目标

e、 g

需要VBA>工具>引用>添加对Microsoft HTML对象库的引用


这假设翻译在
.innerText
中。共享显示翻译的响应的相关部分会有所帮助。

如果您使用早期绑定的html文档,即MSHTML.HTMLDocument,那么您可以访问querySelector,并可以尝试使用css选择器以该元素为目标

e、 g

需要VBA>工具>引用>添加对Microsoft HTML对象库的引用

这假设翻译在
.innerText
中。这将有助于分享回复中显示翻译的相关部分。

谢谢QHarr

我尝试了你的建议,但得到错误91“对象变量或块未设置”。。。我一定是错过了什么,否则我就不清楚了

翻译问题可能与“XMLHTTP”有关,因为在使用Excel中的单元格时,它似乎返回相同的翻译结果

不过我试过你的推荐 这确实返回了正确的翻译响应“salle de l'émetteur”now=“发射机室”,带有
ie.navigate2”https://translate.google.com/#“&”fr“&”/“&”en“&”/“&str”
。但是,此方法翻译工作表太慢,因为我需要翻译60行x 36列的工作表

我调整了你的代码,让它打开IE,然后用一个IE在每个单元格中循环(Goggle Translate)窗口打开,而不是为每个单元格数据翻译打开/关闭窗口。相比之下,它的工作速度非常快。我只需要找出时间问题,因为它从Google Translate获取翻译时并不总是将正确的数据放入单元格

有时,我会在
MyStrings=ie.document.querySelector(“.translation”).innerText处遇到“运行时错误”,因为它是空的。因此我在进程中添加了一个驻留时间。似乎每个转换的单元格都有0.8秒

至少这是朝着正确方向迈出的一步。我会继续把握时机优化流程,除非有其他可行的解决方案或建议

因此,在玩了这个之后,我下面的crud代码似乎正在做这项工作,并且似乎翻译得更快…到目前为止

    Function Translate_fr_en()
    '***This function loops through an array called Data0 loaded with all the values of the worksheet "Translate_Sheet". 
    '    It translates each row of select columns to a mirror image temp worksheet called "Temp". 
    '    It skip past columns not requiring translations since the values are numeric.

    Dim str, strTranslated, TempStr As String
    Dim ws As Worksheet
    Dim i, ii As Integer
    Dim col As Integer
    Dim LastRow As Integer
    Dim ie As Object
    Dim Flag As Boolean

    Set wb = ThisWorkbook
    Set ws = wb.Sheets("Temp")
    Set ie = CreateObject("InternetExplorer.Application")
    rcount = 3 'Temp worksheet row  counter
    ii = 0 'array row counter
    lrow = wb.Sheets("Translate_Sheet").UsedRange.rows.count 'worksheet requiring translation
    LastRow = lrow - 2
    With ie
        For col = 1 To 36
            Select Case col
            Case 1, 5, 6, 9, 10, 11, 18, 21, 31, 32, 33, 34, 36 'Selected columns containing text to translate...other columns not need translation because of numeric values
                'Translate columns with text values requiring translation
                Do Until ii = LastRow '# of rows
                    i = col - 1
                    str = Data0(i, ii) '"Translate_Worksheet" worksheet data preloaded into Data0() array
                    If str = "" Then 'If blank row than do nothing and skip translation
                        ii = ii + 1 'Array row counter
                    Else 'then translate columns with text
            
    skip:
                        .navigate2 "https://translate.google.com/#" & "fr" & "/" & "en" & "/" & str
                        While .busy Or .readystate < 4: DoEvents: Wend
                        If Flag = False Then
                            Application.Wait (Now + timevlue("0:00:01") / 1.3) 'wait 0.769 second for the first tanslation otherwise returns blank value
                            Flag = True
                        End If
                        strTranslated = ie.document.querySelector(".translation").innerText 'get translated text
                        'String comparison...if translated text has "..." at the end of string do again.
                        If strTranslated = CStr(TempStr & "...") Then
                            GoTo skip
                        End If
                        ws.Cells(rcount, col) = strTranslated 'load cell with translation
                        TempStr = ws.Cells(rcount, col)  'TempStr is temp string to hold value for comparison
                        rcount = rcount + 1
                    End If
                Loop
                ii = 0
                rcount = 3
            Case Else 'load Temp worksheet columns with numeric values not requiring translation
                ii = 0
                rcount = 3
                Do Until ii = LastRow
                    str = Data0(i, ii) 'worksheet data
                    ws.Cells(rcount, col) = str
                    ii = ii + 1
                    rcount = rcount + 1
                Loop
                ii = 0
                rcount = 3
            End Select
        Next col
    End With
    Set ie = Nothing

    End Function
函数Translate\u fr\u en()
'***此函数通过一个名为Data0的数组循环,该数组加载了工作表“Translate_Sheet”的所有值。
'它将选择列的每一行转换为名为“temp”的镜像临时工作表。
'它跳过不需要翻译的列,因为这些值是数字。
Dim str,strTranslated,TempStr作为字符串
将ws设置为工作表
作为整数的Dim i,ii
作为整数的Dim col
将最后一行设置为整数
模糊的物体
将标志变暗为布尔值
设置wb=ThisWorkbook
设置ws=wb.Sheets(“临时”)
设置ie=CreateObject(“InternetExplorer.Application”)
rcount=3'临时工作表行计数器
ii=0'阵列行计数器
lrow=wb.Sheets(“Translate_Sheet”).UsedRange.rows.count“需要翻译的工作表”
LastRow=lrow-2
与ie
对于col=1到36
选择案例列
案例1、5、6、9、10、11、18、21、31、32、33、34、36'所选列包含要翻译的文本…其他列由于数值原因不需要翻译
'使用需要翻译的文本值翻译列
直到ii=最后一行'#为止
i=col-1
str=Data0(i,ii)““Translate_工作表”工作表数据预加载到Data0()数组中
如果str=”“,则“如果为空行,则不执行任何操作并跳过翻译”
ii=ii+1'阵列行计数器
然后用文本翻译列
跳过:
.导航
Dim html As MSHTML.HTMLDocument

Set html = New MSHTML.HTMLDocument

html.body.innerHTML = objHTTP.responseText

Debug.Print html.querySelector(".translation[lang=en]").innerText
    Function Translate_fr_en()
    '***This function loops through an array called Data0 loaded with all the values of the worksheet "Translate_Sheet". 
    '    It translates each row of select columns to a mirror image temp worksheet called "Temp". 
    '    It skip past columns not requiring translations since the values are numeric.

    Dim str, strTranslated, TempStr As String
    Dim ws As Worksheet
    Dim i, ii As Integer
    Dim col As Integer
    Dim LastRow As Integer
    Dim ie As Object
    Dim Flag As Boolean

    Set wb = ThisWorkbook
    Set ws = wb.Sheets("Temp")
    Set ie = CreateObject("InternetExplorer.Application")
    rcount = 3 'Temp worksheet row  counter
    ii = 0 'array row counter
    lrow = wb.Sheets("Translate_Sheet").UsedRange.rows.count 'worksheet requiring translation
    LastRow = lrow - 2
    With ie
        For col = 1 To 36
            Select Case col
            Case 1, 5, 6, 9, 10, 11, 18, 21, 31, 32, 33, 34, 36 'Selected columns containing text to translate...other columns not need translation because of numeric values
                'Translate columns with text values requiring translation
                Do Until ii = LastRow '# of rows
                    i = col - 1
                    str = Data0(i, ii) '"Translate_Worksheet" worksheet data preloaded into Data0() array
                    If str = "" Then 'If blank row than do nothing and skip translation
                        ii = ii + 1 'Array row counter
                    Else 'then translate columns with text
            
    skip:
                        .navigate2 "https://translate.google.com/#" & "fr" & "/" & "en" & "/" & str
                        While .busy Or .readystate < 4: DoEvents: Wend
                        If Flag = False Then
                            Application.Wait (Now + timevlue("0:00:01") / 1.3) 'wait 0.769 second for the first tanslation otherwise returns blank value
                            Flag = True
                        End If
                        strTranslated = ie.document.querySelector(".translation").innerText 'get translated text
                        'String comparison...if translated text has "..." at the end of string do again.
                        If strTranslated = CStr(TempStr & "...") Then
                            GoTo skip
                        End If
                        ws.Cells(rcount, col) = strTranslated 'load cell with translation
                        TempStr = ws.Cells(rcount, col)  'TempStr is temp string to hold value for comparison
                        rcount = rcount + 1
                    End If
                Loop
                ii = 0
                rcount = 3
            Case Else 'load Temp worksheet columns with numeric values not requiring translation
                ii = 0
                rcount = 3
                Do Until ii = LastRow
                    str = Data0(i, ii) 'worksheet data
                    ws.Cells(rcount, col) = str
                    ii = ii + 1
                    rcount = rcount + 1
                Loop
                ii = 0
                rcount = 3
            End Select
        Next col
    End With
    Set ie = Nothing

    End Function