Использование python BeautifulSoup для получения значений с веб-сайта с использованием заполнителей jinja - PullRequest
0 голосов
/ 19 июня 2020

Я пытаюсь получить доступ к полям перевода со словарного веб-сайта, используя python и BeautifulSoup следующим образом:

word = "death"
url="https://tatoeba.org/eng/sentences/search?query={}&from=eng&to=deu".format(word)
vstr=requests.get(url).content
soup = BeautifulSoup(vstr,features="html.parser",from_encoding='utf8')
rows = soup.findAll('div', {"class":"sentence-and-translations"})
for row in rows:
    if row:
        a=row.find('div',{'class':'translation'})
        a=a.find('div',{'layout':'row'})
        print(a)

однако части, к которым я хотел бы получить доступ, отображаются только как их тег jinja представление, например:

<div class="text" dir="{{translation.dir}}" flex="" lang="{{translation.lang_tag}}">

Есть ли хороший способ получить значения без использования виртуальных браузеров, таких как селен?

1 Ответ

1 голос
/ 19 июня 2020

Данные встроены в страницу в форме JavaScript. После небольшой настройки вы можете извлечь информацию с помощью модулей re / json:

import html
import json
import requests
from bs4 import BeautifulSoup


kw = 'death'
lang = 'deu'
url = 'https://tatoeba.org/eng/sentences/search?query={kw}&from=eng&to={lang}'

soup = BeautifulSoup(requests.get(url.format(kw=kw, lang=lang)).content, 'html.parser')

for div in soup.select('[sentence-and-translations][ng-init]'):
    i = re.search(r'vm\.init\((.*)\)', div['ng-init']).group(1)
    s = '[' + html.unescape(i).replace(f"'{lang}'", f'"{lang}"') + ']'
    data = json.loads(s)

    # uncomment this to print all data:
    # print(json.dumps(data, indent=4))

    print(data[1]['text'])
    for trans in data[2] + data[3]:
        print(trans['text'])
    print('-' * 80)

Печать:

I escaped death.
Ich bin dem Tod entkommen.
Ich bin dem Tode von der Schippe gesprungen.
Ich bin dem Tod entronnen.
--------------------------------------------------------------------------------
Death before dishonor!
Lieber tot als ehrlos.
--------------------------------------------------------------------------------
Think about death.
Gedenke des Todes.
--------------------------------------------------------------------------------
Death is imminent.
Der Tod ist unvermeidlich.
Der Tod ist unausweichlich.
--------------------------------------------------------------------------------
Victory, or death!
Sieg oder Tod!
--------------------------------------------------------------------------------
I am Death.
Ich bin der Tod.
--------------------------------------------------------------------------------
Death is inevitable.
Der Tod ist unvermeidlich.
Der Tod ist unausweichlich.
--------------------------------------------------------------------------------
Death is certain.
Der Tod ist unvermeidlich.
Der Tod ist unausweichlich.
--------------------------------------------------------------------------------
Death take me.
Der Tod soll mich holen.
--------------------------------------------------------------------------------
Death is scary.
Der Tod macht Angst.
--------------------------------------------------------------------------------
...