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

问题描述 投票:1回答:3

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

我们看到了:

enter image description here

但是在代码中,翻译后的文字是“ 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中提取页面任何部分的翻译?

html selenium xpath beautifulsoup css-selectors
3个回答
2
投票

这来自使用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())

1
投票

要提取文本Bonjour, comment allez-vous aujourd'hui ?,您需要为WebDriverWaitvisibility_of_element_located()引入get_attribute("value")。您可以使用以下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
    

1
投票

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

希望这会有所帮助。

© www.soinside.com 2019 - 2024. All rights reserved.