Я пытаюсь проанализировать таблицу со страницы URL, которую можно найти здесь .
Ниже приведен (прокомментированный) код, который я использую для анализа таблицы:
## Imports (some of them might not be used in this code snippet
import urllib.request, json
import pandas as pd
import bleach
import html.parser
import time
# Read the whole url
with urllib.request.urlopen("https://www.mitomap.org/foswiki/bin/view/MITOMAP/MutationsCodingControl") as url:
data = url.read().decode()
## Specify start and end of the string that contains the table data
start = '"data":['
end = '}]}'
## slice the data into a string specified by start and end
final_string = '{' + data[data.index(start):data.index(end) + len(end)]
## remove the html tags and special characters
clean = html.unescape(bleach.clean(final_string, tags=[], strip=True))
## convert the clean str into a dictionary
json_dict = json.loads(clean)
## convert now json_dict into a df
df = pd.DataFrame(data=json_dict['data'], columns=[json_dict['columns'][i]['title'].strip() for
i in list(range(len(json_dict['columns'])))])
Приведенный выше код работает частично: я получаю pandas
df с нужной мне структурой, хотя у меня возникают проблемы с именами столбцов. Если я делаю: json_dict['columns']
, я получаю:
[{'title': ' Position ', 'type': 'num-html'},
{'title': ' Locus ', 'type': 'string', 'class': 'select-filter'},
{'title': ' Disease ', 'type': 'string'},
{'title': ' Allele ', 'type': 'string'},
{'title': ' NucleotideChange ', 'type': 'string'},
{'title': ' Amino\xa0AcidChange ', 'type': 'string'},
{'title': ' Homoplasmy ', 'type': 'string'},
{'title': ' Heteroplasmy ', 'type': 'string'},
{'title': ' Status ', 'type': 'string'},
{'title': ' GB\xa0Freq\xa0\xa0FL\xa0(CR)*‡ ', 'type': 'string'},
{'title': ' GB\xa0Seqs\xa0FL\xa0(CR)* ', 'type': 'string'},
{'title': ' References ', 'type': 'num-html'}]
И если я делаю df.columns
, я получаю:
Index(['Position', 'Locus', 'Disease', 'Allele', 'NucleotideChange',
'Amino AcidChange', 'Homoplasmy', 'Heteroplasmy', 'Status',
'GB Freq FL (CR)*‡', 'GB Seqs FL (CR)*', 'References'],
dtype='object')
Что означает, что «странные» символы все еще там (например,GB Freq FL (CR)*‡
)
И, наконец, если я сделаю df['Amino AcidChange']
(учитывая, что Amino AcidChange
является элементом в df.columns
), я получу KeyError: 'Amino AcidChange'
.
, я мог бы потенциально заменить«странные» символы в json_dict
с regex
, хотя мне интересно:
- Откуда эти «странные» символы? Имеет ли это какое-либо отношение к кодированию?
- Как я могу проанализировать информацию из
data
(возможно, изменив параметры, переданные в url.read().decode()
) без этих "странных" символов?