Использование BeautifulSoup4 с Google Translate

python html beautifulsoup bs4

647 просмотра

2 ответа

126 Репутация автора

В настоящее время я прохожу раздел Auto Scattering в AutomateTheBoringStuff и пытаюсь написать скрипт, который извлекает переведенные слова из Google Translate с помощью BeautifulSoup4.

Я проверил содержание html страницы, где слово «Explanation» переводится:

<span id="result_box" class="short_text" lang="en">  
    <span class>Explanation</span>
</span>

Используя BeautifulSoup4, я пробовал разные селекторы, но ничего не вернуло переведенное слово. Вот несколько примеров, которые я пробовал, но они не дают никаких результатов:

soup.select('span[id="result_box"] > span')  
soup.select('span span') 

Я даже скопировал селектор прямо из Инструментов разработчика, что дало мне #result_box> span . Это снова не дает никаких результатов.

Может кто-нибудь объяснить мне, как использовать BeautifulSoup4 для моих целей? Я впервые использую BeautifulSoup4, но думаю, что я использую BeautifulSoup более или менее правильно, потому что селектор

soup.select('span[id="result_box"]')

получает меня внешний элемент span **

[<span class="short_text" id="result_box"></span>]

** Не уверен, почему отсутствует часть 'leng = "en"', но я вполне уверен, что нашел правильный элемент независимо от этого.

Вот полный код:

import bs4, requests

url = 'https://translate.google.ca/#zh-CN/en/%E6%B2%BB%E5%85%B7'
res = requests.get(url)
res.raise_for_status
soup = bs4.BeautifulSoup(res.text, "html.parser")
translation = soup.select('#result_box span')
print(translation)

РЕДАКТИРОВАТЬ: если я сохраню страницу Google Translate как автономный HTML-файл, а затем сделаю объект суп из этого HTML-файла, не будет проблем с поиском элемента.

import bs4

file = open("Google Translate.html")
soup = bs4.BeautifulSoup(file, "html.parser")
translation = soup.select('#result_box span')
print(translation)
Автор: Ken Lin Источник Размещён: 19.07.2016 07:13

Ответы (2)


0 плюса

4611 Репутация автора

Просто попробуйте это:

translation = soup.select('#result_box span')[0].text
print(translation)
Автор: akash karothiya Размещён: 19.07.2016 07:26

1 плюс

141592 Репутация автора

Решение

Элемент result_box - это правильный элемент, но ваш код работает только тогда, когда вы сохраняете то, что видите в своем браузере, так как оно включает в себя динамически генерируемый контент, используя запросы, вы получаете только исходный код, исключая динамически генерируемый контент. Перевод генерируется с помощью ajax-вызова на URL ниже:

"https://translate.google.ca/translate_a/single?client=t&sl=zh-CN&tl=en&hl=en&dt=at&dt=bd&dt=ex&dt=ld&dt=md&dt=qca&dt=rw&dt=rm&dt=ss&dt=t&ie=UTF-8&oe=UTF-8&source=bh&ssel=0&tsel=0&kc=1&tk=902911.786207&q=%E6%B2%BB%E5%85%B7"

По вашим запросам возвращается:

[[["Fixture","治具",,,0],[,,,"Zhì jù"]],,"zh-CN",,,[["治 具",1,[["Fixture",999,true,false],["Fixtures",0,true,false],["Jig",0,true,false],["Jigs",0,true,false],["Governance",0,true,false]],[[0,2]],"治具",0,1]],1,,[["ja"],,[1],["ja"]]]

Поэтому вам придется либо подражать запросу, передавая все необходимые параметры, либо использовать что-то, поддерживающее динамический контент, например селен.

Автор: Padraic Cunningham Размещён: 19.07.2016 08:40
Вопросы из категории :
32x32