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