我正在尝试从网址页面解析一个表,该页面可以在here中找到。
下面是我用来解析表格的(注释)代码:
## 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()
的参数)而没有那些'奇怪'字符?