I am trying to read the tables from a Wikipedia page using the following code:
import pandas as pd
pd.read_html('https://en.wikipedia.org/wiki/2013–14_Premier_League')
Doing that generates the following error:
UnicodeEncodeError: 'ascii' codec can't encode character '\u2013' in position 14: ordinal not in range(128)
I have tried
pd.read_html('https://en.wikipedia.org/wiki/2013–14_Premier_League', encoding='utf-8')
But still get the same error. The following works:
import requests
r = requests.get('https://en.wikipedia.org/wiki/2017–18_Premier_League')
c = r.content
dfs = pd.read_html(c)
What I want to know is how to get pd.read_html() to work directly on the url without requests. What is it that I don't understand about encoding or is this a problem with Pandas?
I am running an Anaconda distribution of Pandas 0.21.1 and Python 3.5.4. Thanks for any help.
Comment From: WillAyd
Hmm interesting. Looks like this is still an issue on master even specifying the encoding to be used:
>>> pd.read_html('https://en.wikipedia.org/wiki/2013–14_Premier_League', encoding='utf-8')
UnicodeEncodeError: 'ascii' codec can't encode character '\u2013' in position 14: ordinal not in range(128)
Investigation and PRs are always welcome
Comment From: hannah2048
https://stackoverflow.com/questions/39229439/encoding-error-when-reading-url-with-urllib
As seen in this similar issue, urllib only works with ASCII requests. To remedy, I used the Requests library (http://docs.python-requests.org/en/master/).
Comment From: Liam3851
FWIW the sample call works fine under Python 2.7.15 but not Python 3.6.5. Choice of engine doesn't matter, however.
Comment From: StepanSushko
I used the following solution:
import requests url = "https://ru.wikipedia.org/wiki/Города_России_с_населением_более_500_тысяч_человек" r = requests.get(url, auth=('user', 'pass')) website = r.text
import pandas as pd tables = pd.read_html( website, encoding="UTF-8")
City_pop = tables[4]
Comment From: jadore801120
@StepanSushko 's solution works for me.
Comment From: kouml
I investigate this error, and I personally think it should be fixed. Let me take it and send PR. In urllib's library, all URL characters should be ASCII, so what you need is just pass the escaped URL if you have multibyte. also, urllib is the Python's standard library.
Reproduce
import urllib
import pandas
url = "https://en.wikipedia.org/wiki/2013–14_Premier_League"
url_escaped = urllib.parse.quote_plus(url, "/:?=&") # need this line
print(f"url:{url}")
print(f"escaped:{url_escaped}")
tables = pd.read_html(url_escaped, encoding="UTF-8") # non-error
tables = pd.read_html(url, encoding="UTF-8") # error
$ url:https://en.wikipedia.org/wiki/2013–14_Premier_League
$ escaped:https://en.wikipedia.org/wiki/2013%E2%80%9314_Premier_League
Solution
url = urllib.parse.quote_plus(url, "/:?=&") # need this line
tables = pd.read_html(url, encoding="UTF-8") # non-error
so, we can just use urllib instead of requests.
Comment From: kouml
I'm gonna try to implement the Unicode handling feature, but because of Python's RFC design, This is treated as the spec rather than the bug.
details are written here. https://github.com/pandas-dev/pandas/pull/50259