如何在DeepL页面的textarea框架中提取文本?

2024-06-07 01:25:57 发布

您现在位置:Python中文网/ 问答频道 /正文

https://www.deepl.com/translator#en/fr/Hello%2C%20how%20are%20you%20today%3F

我们看到:

enter image description here

但在代码中,翻译文本“你好,评论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页面的任何部分提取翻译?


Tags: 代码https文本com框架源代码www页面
3条回答

要从textarea字段中提取文本,请使用.get_attribute('value')

这里我添加了Selenium使用WebDriverWait.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()

希望这有帮助

要提取文本Bonjour, comment allez-vous aujourd'hui ?,需要为visibility_of_element_located()get_attribute("value")归纳WebDriverWait。您可以使用以下任一Locator Strategies

  • 使用CSS_SELECTORget_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"))
    
  • 使用XPATHget_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
    

这源于在以下情况下使用JSON RPC的外部API的结果:

POST https://www2.deepl.com/jsonrpc

使用一些参数,例如要翻译的文本和目标语言

中使用的示例如下:

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())

Try this on repl.it

相关问题 更多 >