Search code examples
pythonweb-scrapingbeautifulsouptranslationexport-to-csv

How to translate language of scraped text when exporting to .csv or .xslx?


I'm trying to scrape election results from a variety of public government websites and place them in a .csv or .xlsx file. When I export text data to either type of spreadsheet, however, I am met with an output that looks like:

ÏÎ˲ÒÈ×ÍÀ ÏÀÐÒ²ß "ÓÊÐÀ¯ÍÑÜÊÀ ÑÒÐÀÒÅÃ²ß ÃÐÎÉÑÌÀÍÀ"

On the website, the text looks like:

ПОЛІТИЧНА ПАРТІЯ "СЛУГА НАРОДУ"

But I'm trying to get it to look like:

POLITICAL PARTY "SERVANT OF THE PEOPLE"

I've tried to import the .csv file to a new excel document encoded using UTF-8 and a variety of other "file origins," but the output looks the same. I've even tried to translate the text using Google Translate on Google Sheets, but that isn't working either. Any ideas on how to translate/transliterate scraped text that is originally in a different script (text style)?

Here's my script:

import requests
from requests import get
from bs4 import BeautifulSoup
import pandas as pd

from time import sleep
from random import randint

partynames = []

for page in range(11,222):
    page = requests.get("https://www.cvk.gov.ua/pls/vnd2019/wp304pt001f01=919pf7331=" + str(page) + ".html", verify=False)

    soup = BeautifulSoup(page.text, 'html.parser')
    
    ukraine_tr = soup.find_all('tr')

    sleep(randint(2,10))

    for container in ukraine_tr:

        #### PARTY NAMES ####
        partyn = container.find('a',class_='a2')
        if partyn is not None:
            name = partyn.get_text()
        else:
            name = "N/A"
        partynames.append(name)

ukraine = pd.DataFrame({
'pty_n': partynames
})

ukraine.to_csv('ukraine.csv')

Solution

  • Actually, there's a simple fix to that:

    You have to swap encodings with:

    page.encoding = page.apparent_encoding
    

    Here's a working example based on your code:

    import requests
    from bs4 import BeautifulSoup
    import pandas as pd
    
    from time import sleep
    from random import randint
    
    partynames = []
    
    for page in range(11, 12):
        page = requests.get("https://www.cvk.gov.ua/pls/vnd2019/wp304pt001f01=919pf7331=" + str(page) + ".html",
                            verify=False)
        page.encoding = page.apparent_encoding
    
        soup = BeautifulSoup(page.text, 'html.parser')
        ukraine_tr = soup.find_all('tr')
        sleep(randint(2, 10))
    
        for container in ukraine_tr:
            partyn = container.find('a', class_='a2')
            if partyn is not None:
                name = partyn.get_text()
            else:
                name = "N/A"
            partynames.append(name)
    
    ukraine = pd.DataFrame({
        'pty_n': partynames
    })
    
    ukraine.to_csv('ukraine.csv')
    

    Output:

    3,"ПОЛІТИЧНА ПАРТІЯ ""СЛУГА НАРОДУ"""
    4,"ПОЛІТИЧНА ПАРТІЯ ""УКРАЇНСЬКА СТРАТЕГІЯ ГРОЙСМАНА"""
    5,"Політична партія ""Європейська Солідарність"""
    6,"політична партія Всеукраїнське об’єднання ""Батьківщина"""
    7,"ПОЛІТИЧНА ПАРТІЯ ""СИЛА І ЧЕСТЬ"""
    8,"Політична партія ""ОПОЗИЦІЙНА ПЛАТФОРМА – ЗА ЖИТТЯ"""
    9,"Політична Партія ""ГОЛОС"""
    10,"політична партія Всеукраїнське об’єднання ""Свобода"""
    11,"ПОЛІТИЧНА ПАРТІЯ ""ПАРТІЯ ШАРІЯ"""
    12,"ПОЛІТИЧНА ПАРТІЯ ""РАДИКАЛЬНА ПАРТІЯ ОЛЕГА ЛЯШКА"""
    13,"Політична партія ""ОПОЗИЦІЙНИЙ БЛОК"""
    14,"політична партія ""Громадянська позиція"""
    15,"Політична партія ""Рух Нових Сил Михайла Саакашвілі"""
    16,"ПОЛІТИЧНА ПАРТІЯ ""ПАРТІЯ ЗЕЛЕНИХ УКРАЇНИ"""
    17,"Політична партія ""Об’єднання ""САМОПОМІЧ"""
    18,Аграрна партія України
    19,"Політична партія ""Сила Людей"""
    20,"ПОЛІТИЧНА ПАРТІЯ ""СИЛА ПРАВА"""
    21,"ПОЛІТИЧНА ПАРТІЯ ""СОЦІАЛЬНА СПРАВЕДЛИВІСТЬ"""
    22,"Політична Партія ""ПАТРІОТ"""
    23,"ПОЛІТИЧНА ПАРТІЯ ""НЕЗАЛЕЖНІСТЬ"""
    24,"ПОЛІТИЧНА ПАРТІЯ ""ВСЕУКРАЇНСЬКЕ ОБ’ЄДНАННЯ ""ФАКЕЛ"""
    

    EDIT:

    Getting things translated!

    You can use googletrans to get the source text translated to English.

    First run this pip install googletrans and then try this:

    from time import sleep
    from random import randint
    
    import pandas as pd
    import requests
    from bs4 import BeautifulSoup
    from googletrans import Translator
    
    
    traslator = Translator()
    partynames = []
    
    
    for page in range(11, 12):
        page = requests.get("https://www.cvk.gov.ua/pls/vnd2019/wp304pt001f01=919pf7331=" + str(page) + ".html",
                            verify=False)
        page.encoding = page.apparent_encoding
    
        soup = BeautifulSoup(page.text, 'html.parser')
        ukraine_tr = soup.find_all('tr')
        sleep(randint(2, 10))
    
        for container in ukraine_tr:
            partyn = container.find('a', class_='a2')
            if partyn is not None:
                name = traslator.translate(partyn.get_text()).text
            else:
                name = "N/A"
    
            partynames.append(name)
    
    ukraine = pd.DataFrame({
        'pty_n': partynames
    })
    
    ukraine.to_csv('ukraine.csv')
    

    Output:

    3,"POLITICAL PARTY ""SERVANT OF THE PEOPLE"""
    4,"POLITICAL PARTY ""UKRAINIAN GROISMAN'S STRATEGY"""
    5,European Solidarity Political Party
    6,Batkivshchyna All-Ukrainian Union Political Party
    7,"POLITICAL PARTY ""POWER AND HONOR"""
    8,"Political party ""OPPOSITION PLATFORM - FOR LIFE"""
    9,VOICE Political Party
    10,"political party All-Ukrainian Union ""Freedom"""
    11,"POLITICAL PARTY ""PARTY OF SHARIA"""
    12,"POLITICAL PARTY ""RADICAL PARTY OF OLEH LYASHKO"""
    13,OPPOSITION BLOC political party
    14,Civic Position political party
    15,Mikheil Saakashvili's New Forces Movement political party
    16,"POLITICAL PARTY ""PARTY OF THE GREENS OF UKRAINE"""
    17,SAMOPOMICH Association Political Party
    18,Agrarian Party of Ukraine
    19,People's Power Political Party
    20,"POLITICAL PARTY ""POWER OF LAW"""
    21,SOCIAL JUSTICE POLITICAL PARTY
    22,PATRIOT Political Party
    23,INDEPENDENCE POLITICAL PARTY
    24,"ALL-UKRAINIAN ASSOCIATION ""TORCH"" POLITICAL PARTY"