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

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

Я просмотрел html-содержимое страницы, где «Пояснение» — это переведенное слово:

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

person Ken Lin    schedule 19.07.2016    source источник
comment
Ваш код в порядке, проблема в динамически генерируемом контенте, перевод недоступен в исходном коде, который вы возвращаете.   -  person Padraic Cunningham    schedule 19.07.2016


Ответы (2)


Div 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"]]]

Таким образом, вам придется либо имитировать запрос, передавая все необходимые параметры, либо использовать что-то, что поддерживает динамический контент, например selenium

person Padraic Cunningham    schedule 19.07.2016
comment
Спасибо за ответ. Я думаю, что вместо этого я перепишу код, используя селен. У меня есть вопрос к вам: как вы узнали, что контент был динамически сгенерирован? - person Ken Lin; 19.07.2016
comment
@ken, самый простой способ - щелкнуть правой кнопкой мыши и выбрать источник просмотра, то, что вы видите, - это то, что будут извлекаться запросы. - person Padraic Cunningham; 19.07.2016
comment
Я вижу, это будет очень полезно, когда я буду использовать запросы в будущем. Небольшой вопрос: считается ли динамически сгенерированный контент HTML-контентом? - person Ken Lin; 20.07.2016

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

translation = soup.select('#result_box span')[0].text
print(translation)
person akash karothiya    schedule 19.07.2016
comment
Привет, использование этого приводит к ошибке IndexError: list index out of range, что, как мне кажется, связано с тем, что в переводе не было результата, и, следовательно, перевод [0] недействителен. - person Ken Lin; 19.07.2016
comment
удалите html.parser, а затем попробуйте - person akash karothiya; 19.07.2016
comment
Привет, это было использовано для удаления UserWarning из bs4. Тем не менее, я удалил его, но появилась та же ошибка. Я также отредактировал свой образец кода, сделав его полной, урезанной версией, чтобы другие пользователи могли попробовать отладить его, поэтому, если бы вы могли исправить этот код и проверить его на своем компьютере, это было бы здорово! - person Ken Lin; 19.07.2016
comment
Проверьте, какое значение имеет объект супа, преобразуется ли ваша html-строка в древовидную структуру. - person akash karothiya; 19.07.2016
comment
Можете ли вы объяснить, как выглядит древовидная структура для новичка вроде меня простыми словами? Кроме того, я понял, что если я сохраню страницу в виде html-файла, открою html-файл в python, сделаю из него объект супа, ваш код будет работать нормально. Я добавил код, который использовал для автономного html-файла, пожалуйста, посмотрите. - person Ken Lin; 19.07.2016