来自https://www.deepl.com/translator#en/fr/Hello%2C%20how%20are%20you%20today%3F
我们看到了:
但是在代码中,翻译后的文字是“ Bonjour,评论allez-vous aujourd'hui?”。不会出现在页面源代码的任何位置,并且框架的代码如下所示:
<textarea class="lmt__textarea lmt__target_textarea lmt__textarea_base_style"
data-gramm_editor="false" tabindex="110" dl-test="translator-target-input"
lang="fr-FR" style="height: 300px;"></textarea>
而且,无论我如何通过BeautifulSoup阅读文本或来源,都无法提取textarea
框架中的译文。
import requests
from bs4 import BeautifulSoup
response = requests.get('https://www.deepl.com/translator#en/fr/Hello%2C%20how%20are%20you%20today%3F')
bsoup = BeautifulSoup(response.content.decode('utf8'))
bsoup.find_all('textarea')
如何从https://www.deepl.com/translator中提取页面任何部分的翻译?
这来自使用JSON RPC的外部API的结果:
POST https://www2.deepl.com/jsonrpc
带有一些参数,例如要翻译的文本和目标语言。
[使用python的python-requests中的示例:
import requests
import time
url = "https://www2.deepl.com/jsonrpc"
text = "Hello, how are you today?"
r = requests.post(
url,
json = {
"jsonrpc":"2.0",
"method": "LMT_handle_jobs",
"params": {
"jobs":[{
"kind":"default",
"raw_en_sentence": text,
"raw_en_context_before":[],
"raw_en_context_after":[],
"preferred_num_beams":4,
"quality":"fast"
}],
"lang":{
"user_preferred_langs":["FR","EN"],
"source_lang_user_selected":"auto",
"target_lang":"FR"
},
"priority":-1,
"commonJobParams":{},
"timestamp": int(round(time.time() * 1000))
},
"id": 40890008
}
)
print(r.json())
要提取文本Bonjour, comment allez-vous aujourd'hui ?
,您需要为WebDriverWait和visibility_of_element_located()
引入get_attribute("value")
。您可以使用以下Locator Strategies之一:
使用CSS_SELECTOR
和get_attribute("value")
:
driver.get('https://www.deepl.com/translator#en/fr/Hello%2C%20how%20are%20you%20today%3F')
print(WebDriverWait(driver, 10).until(EC.visibility_of_element_located((By.CSS_SELECTOR, "textarea.lmt__textarea.lmt__target_textarea.lmt__textarea_base_style"))).get_attribute("value"))
使用XPATH
和get_attribute("value")
:
driver.get('https://www.deepl.com/translator#en/fr/Hello%2C%20how%20are%20you%20today%3F')
print(WebDriverWait(driver, 10).until(EC.visibility_of_element_located((By.XPATH, "//textarea[@class='lmt__textarea lmt__target_textarea lmt__textarea_base_style']"))).get_attribute("value"))
控制台输出:
Bonjour, comment allez-vous aujourd'hui ?
注:您必须添加以下导入:
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
要从textarea
字段中提取文本,请使用.get_attribute('value')
。
在这里,我使用WebDriverWait
方法添加了Selenium等待元素使用.visibility_of_element_located
的方式。
但是有时当元素可用时(对于这种情况),它不能保证文本已经存在,因此请添加循环,直到text != ''
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import time
#maybe you need browser executable path here
driver = webdriver.Chrome()
driver.get('https://www.deepl.com/translator#en/fr/Hello%2C%20how%20are%20you%20today%3F')
while True:
element = WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.CSS_SELECTOR, 'div.lmt__side_container--target textarea')))
if(element.get_attribute('value') != ''):
time.sleep(1)
text_target = element.get_attribute('value')
break
print(text_target)
driver.quit()
希望这会有所帮助。