Гиббери sh вывод текста из-за кодировки при парсинге веб-страниц - PullRequest
1 голос
/ 21 июня 2020

Я пытаюсь получить текст на персидском языке из Google Translate, и лучший тип кодировки для персидского - UTF-8.

Google Translate использует Javascript для рендеринга своих HTML кодов, поэтому я использую для этого модуль html-requests.

У меня проблема с выводом, который я получаю каждый раз, либо когда я использую print(), либо когда я пытаюсь записать его в файл . Оба способа дадут мне gibberi sh неперсидский текст, и я знаю, что это из-за кодировки или чего-то в этом роде.

Итак, я пытался изменить кодировку на utf-8, когда мог, это мой код:

import requests_html
from bs4 import BeautifulSoup as BS

url = "https://translate.google.com/#view=home&op=translate&sl=en&tl=hy&text={}"
text = input("text: ")

session = requests_html.HTML(url=url.format(text), html='str')

session.render() # for executing js scripts
content = session.raw_html
            
soup = BS(content, "html.parser", from_encoding='utf-8')
table_rows = soup.find("table", "gt-baf-table").find_all('span')

# this is my way for write the output into a file
with open('file.txt', 'wb') as file:
    for table_row in table_rows:
        file.write(table_row.text.encode('utf-8'))

Это результат, который я получил для слова пробел :

nounտարածությունտարածությունspacedistanceareaspreadroomtractծավալծավալvolumesizemagnitudebulkspacecontentնստելատեղնստելատեղsiegespaceհեռավորությունհեռավորությունdistancelengthspaceintervalwayտևողությունտևողությունspacestanding

Примечание: Я пытался написать все кодов HTML, которые я получил из session.raw_html, и в файл, затем найдите эти персидские тексты в коде HTML, но это привело к тому же, что и вышеприведенный вывод, я получил gibberi sh и бессмысленный текст .

Ответы [ 2 ]

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

&sl=en&tl=hy означает Engli sh на армянский . в вашем url. Для персидского используйте &tl=fa. См. Полный список в Двухбуквенные языковые коды Google Translate :

No. Language Name         Native Language Name Code 
--- -------------         -------------------- ---- 
1   Afrikaans             Afrikaans            af   
2   Albanian              Shqip                sq   
3   Arabic                عربي                 ar   
4   Armenian              Հայերէն              hy   
5   Azerbaijani           آذربایجان دیلی       az   
6   Basque                Euskara              eu   
7   Belarusian            Беларуская           be   
8   Bulgarian             Български            bg   
9   Catalan               Català               ca   
10  Chinese (Simplified)  中文简体                 zh-CN
11  Chinese (Traditional) 中文繁體                 zh-TW
12  Croatian              Hrvatski             hr   
13  Czech                 Čeština              cs   
14  Danish                Dansk                da   
15  Dutch                 Nederlands           nl   
16  English               English              en   
17  Estonian              Eesti keel           et   
18  Filipino              Filipino             tl   
19  Finnish               Suomi                fi   
20  French                Français             fr   
21  Galician              Galego               gl   
22  Georgian              ქართული              ka   
23  German                Deutsch              de   
24  Greek                 Ελληνικά             el   
25  Haitian Creole        Kreyòl ayisyen       ht   
26  Hebrew                עברית                iw   
27  Hindi                 हिन्दी               hi   
28  Hungarian             Magyar               hu   
29  Icelandic             Íslenska             is   
30  Indonesian            Bahasa Indonesia     id   
31  Irish                 Gaeilge              ga   
32  Italian               Italiano             it   
33  Japanese              日本語                  ja   
34  Korean                한국어                  ko   
35  Latvian               Latviešu             lv   
36  Lithuanian            Lietuvių kalba       lt   
37  Macedonian            Македонски           mk   
38  Malay                 Malay                ms   
39  Maltese               Malti                mt   
40  Norwegian             Norsk                no   
41  Persian               فارسی                fa   
42  Polish                Polski               pl   
43  Portuguese            Português            pt   
44  Romanian              Română               ro   
45  Russian               Русский              ru   
46  Serbian               Српски               sr   
47  Slovak                Slovenčina           sk   
48  Slovenian             Slovensko            sl   
49  Spanish               Español              es   
50  Swahili               Kiswahili            sw   
51  Swedish               Svenska              sv   
52  Thai                  ไทย                  th   
53  Turkish               Türkçe               tr   
54  Ukrainian             Українська           uk   
55  Urdu                  اردو                 ur   
56  Vietnamese            Tiếng Việt           vi   
57  Welsh                 Cymraeg              cy   
58  Yiddish               ייִדיש               yi   

К вашему сведению, следующий скрипт работает для меня:

import requests_html
from bs4 import BeautifulSoup as BS

url = "https://translate.google.com/#view=home&op=translate&sl=en&tl=fa&text={}"
#text = input("text: ")
text = 'I have a problem with the output that I get each time.'

session = requests_html.HTML(url=url.format(text), html='str')

session.render() # for executing js scripts
content = session.raw_html
            
soup = BS(content, "html.parser", from_encoding='utf-8')
table_rows = soup.find('span', attrs={'class':'tlid-translation translation'}).find_all('span')

for table_row in table_rows:
    print(table_row.text)

Вывод:

D:\bat\SO\62499600.py
من با خروجی که هر بار می گیرم مشکلی دارم.

К сожалению, я не понимаю фарси поэтому попробовал использовать &tl=ru (русский):

У меня проблема с выводом, который я получаю каждый раз.
1 голос
/ 21 июня 2020

Как уже объяснил @JosefZ, вам нужно изменить с армянского на персидский. Для извлечения желаемого содержимого, которое, как я полагаю, является переведенной частью, я предлагаю использовать приведенный ниже фрагмент, а затем записать его в файл с использованием правильной кодировки.

desired_rows = soup.findAll("span", {"class": "gt-baf-cell"})

Надеюсь, это поможет!

...